Java--Stream流详解仅供学习

news/2024/10/19 7:37:12/

Java 8中新增的Stream可以让你非常方便地对集合进行过滤,映射,切片等各种操作。Stream流可连续调用多个操作,可以单独执行,也可以合并一起执行。

创建Stream
Java 8中通过 Collection 接口增加了 stream() 和 parallelStream() 方法,可以用来生成流。

通过 Collection 系列集合提供的 stream() 或 parallelStream() 生成串行流或并行流

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
Stream<String> stream = strings.stream();
// 或者
Stream<String> parallelStream = strings.parallelStream();

通过 Java 8 中提供的 Stream.of() 方法,可以通过显式值创建一个流。它可以接受任何数量的参数

Stream<String> stream = Stream.of("abc", "", "bc", "efg", "abcd","", "jkl");

通过Stream.iterate()方法,可以生成一个无限长度的流,并且每个元素都是通过指定函数生成的。下面是一个生成 10 个随机整数的示例:

Stream.iterate(1, n -> n + 1).limit(10).forEach(System.out::println);

Stream操作
可以在一个 Stream 上执行欲进行的多个操作,并使用Stream API 提供的函数式接口中的方法对流进行扩展。Stream 有以下几种常见的操作:

Intermediate 操作
filter()
map()
sorted()
distinct()
limit()
skip()
Terminal 操作
forEach()
toArray()
reduce()
collect()
min()
max()
count()
anyMatch()
allMatch()
noneMatch()
findAny()
findFirst()

Intermediate 操作是惰性的; 它们立即返回流,但在流的 Terminal 操作执行之前不会执行。Terminal 操作实际上执行流的处理过程,并生成一个结果。

下面是一些常见的 Stream 操作示例:

filter()操作:用于通过设置的条件过滤出元素,返回一个新的流。

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());

map()操作:用于将一个元素转换成另一个元素,返回一个新的流。

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 8, 9);
List<Integer> squaresList = numbers.stream().map(n -> n * n).distinct().collect(Collectors.toList());

sorted()操作:用于对流进行排序。可以带一个 comparator 作为排序规则。

List<String> sorted = strings.stream().sorted().collect(Collectors.toList());

distinct()操作:用于去重,获取一个包含唯一元素的新流。

List<String> distinct = strings.stream().distinct().collect(Collectors.toList());

limit()操作:用于获取指定数量的元素。

List<Integer> limitNumbers = numbers.stream().limit(4).collect(Collectors.toList());

skip()操作:用于跳过指定数量的元素。

List<Integer> skipNumbers = numbers.stream().skip(4).collect(Collectors.toList());

forEach()操作:用于迭代流中的每个数据。
strings.stream().forEach(System.out::println);
collect()操作:将流转化为其他形式。接收一个 Collector 接口的实现,用于给流中元素做汇总的方法。

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
Set<String> filteredSet = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toSet());
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));

以下是更多的流操作示例:

reduce()操作:可以将流中的所有元素累加得到一个结果。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> sum = numbers.stream().reduce((x, y) -> x + y);

toArray()操作:将流中的元素转换为数组类型。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Integer[] numArr = numbers.stream().toArray(Integer[]::new);

min()和max()操作:返回流中的最小或最大元素。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> minVal = numbers.stream().min(Integer::compare);
Optional<Integer> maxVal = numbers.stream().max(Integer::compare);

anyMatch()操作:用于判断流中的元素是否匹配给定的条件。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
boolean anyMatch = numbers.stream().anyMatch(x -> x % 2 == 0); //是否存在偶数

allMatch()操作:用于判断流中的所有元素是否都匹配给定的条件。

List<Integer> numbers = Arrays.asList(2, 4, 6, 8, 10);
boolean allMatch = numbers.stream().allMatch(x -> x % 2 == 0);//是否所有元素都是偶数

noneMatch()操作:用于判断流中的所有元素是否都不匹配给定的条件。

List<Integer> numbers = Arrays.asList(1, 3, 5, 7, 9);
boolean noneMatch = numbers.stream().noneMatch(x -> x % 2 == 0);//是否都不是偶数

findFirst()操作:返回流中的第一个元素。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> firstNum = numbers.stream().findFirst();

findAny()操作:返回流中的任意一个元素。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> anyNum = numbers.stream().findAny();

parallelStream()操作:用于将流并行化。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.parallelStream().mapToInt(x -> x).sum();

Stream流是Java 8中非常强大和方便的一种操作集合的方式,更多操作方法可以参考Java官方文档中的Stream流文档进行了解。


http://www.ppmy.cn/news/107156.html

相关文章

VM——编写脚本,TCP发送16进制字符串

1、参考&#xff1a; &#xff08;1&#xff09;​​​(246条消息) TCP中发送接收16进制数&#xff08;16进制字符串与字节数组之间的转换&#xff09;_tcp发送16进制字符串_start_continue的博客-CSDN博客 &#xff08;2&#xff09;(246条消息) C#byte String转换_c# byte转…

泛型的介绍以及原理

目录 一、前言 二、什么泛型 三、为什么要使用泛型 3.1、保证了类型的安全性。 3.2、消除强制转换 3.3、提高程序的性能 3.4、 提高了代码的重用性 四、如何使用泛型 4.1、 泛型类 4.2、泛型接口 4.3、泛型方法 五、泛型通配符 5.1、无边界的通配符 5.2、固定上边…

「接口汇总」APISpace 常用的免费API 整理

空气质量查询&#xff1a;支持国内3400个城市的整点观测&#xff0c;并附带空气质量监测点&#xff08;全国共2335个&#xff09;的整点观测数据。天气预报查询&#xff1a;支持全国以及全球多个城市的天气查询&#xff0c;包含国内3400个城市以及国际4万个城市的实况数据&…

TensorFlow、PyTorch分布式训练

要在两台主机之间使用分布式训练&#xff0c;您可以使用一些深度学习框架提供的工具和库来实现。 这里以TensorFlow为例&#xff0c;介绍一下如何在两台主机之间使用分布式训练。 首先&#xff0c;您需要安装TensorFlow和CUDA等相关软件&#xff0c;并确保两台主机都可以访问…

Python - Pycharm 配置 autopep8 并设置快捷键

什么是 PEP8 官方&#xff1a;PEP 8 – Style Guide for Python Code | peps.python.org 中文翻译博客&#xff1a;https://www.cnblogs.com/ajianbeyourself/p/4377933.html PEP8 是 Python 官方推出的一套编码的规范&#xff0c;只要代码不符合它的规范&#xff0c;就会有…

vulnhub dc-8

1.信息搜集 端口 22,80,31337 存活ip 192.168.85.136 2.访问网站&#xff0c;进行信息搜集 在欢迎页面发现sql注入 sqlmap进行跑数据 python sqlmap.py -u "http://192.168.85.136/?nid1" --batch -D d7db -T users -C name,pass --dump尝试robots.txt,发现后他登…

android DatePicker 和 TimePicker 样式

这种 DatePicker 样式&#xff0c;对应的 xml 这里 year, month, day 都支持双向绑定 <DatePickerandroid:id"id/datePicker"android:layout_width"match_parent"android:layout_height"wrap_content"app:layout_constraintTop_toBottomOf&…

算法27:最长回文子序列长度——范围模型

目录 题目&#xff1a; 样本模型&#xff1a; 递归版本的范围模型 分析过程 动态规划版本 优化动态规划&#xff1a; 题目&#xff1a; 给定一个字符串str&#xff0c;返回这个字符串的最长回文子序列长度 比如 str “a12b3c43def2ghi1kpm” * 最长回文子序列是“123…