一、基本概念
JDK8引入了Stream API,将函数式编程思想带入Java。Stream是一种来自数据源的元素序列,支持 lambda 表达式操作。它可以让集合处理变得更简单、更快速、并且更安全。Stream提供了一种高效、易于使用、并行计算的方式来处理数据。它能够让你以一种声明性方式处理数据,而不是以一种命令式方式来处理。
// 一个简单的Stream示例 List list = Arrays.asList(1, 2, 3); int sum = list.stream().mapToInt(x -> x).sum(); System.out.println(sum); // 输出6
我们首先通过 `Arrays.asList` 函数生成了一个含有三个元素的List,接着调用 `stream()` 方法将List转为Stream类型,然后通过 `mapToInt` 方法将Stream的元素转为int类型,最后通过 `sum` 方法进行求和操作。由此可见,Stream非常方便地实现了一些常用操作。
二、基本操作
1、Filter:过滤元素
Filter操作接受一个lambda表达式,根据条件过滤并返回一个新的Stream,例如下面的例子中过滤出了小于5的元素:
List list = Arrays.asList(1, 2, 3, 4, 5); List filteredList = list.stream().filter(x -> x < 5).collect(Collectors.toList()); System.out.println(filteredList); // 输出[1, 2, 3, 4]
2、Map:元素映射
Map操作接受一个lambda表达式,将该Stream中的元素映射为另一种类型,例如下面的例子中将每个元素都乘2:
List list = Arrays.asList(1, 2, 3); List mappedList = list.stream().map(x -> x * 2).collect(Collectors.toList()); System.out.println(mappedList); // 输出[2, 4, 6]
3、Reduce:元素归约
Reduce操作可以将Stream中的所有元素归约为一个结果。例如下面的例子中将Stream中所有元素求和:
List list = Arrays.asList(1, 2, 3); int sum = list.stream().reduce(0, (x, y) -> x + y); System.out.println(sum); // 输出6
这段代码中,reduce方法的第一个参数为初始值0,第二个参数为lambda表达式,该表达式的两个参数分别为上一次归约的结果和Stream中下一个元素。这里我们将上一次结果加上下一个元素来实现求和操作。
4、Sorted:元素排序
Sorted操作将Stream中的元素按照指定顺序排序,默认为自然排序。例如下面的例子中按照从大到小的顺序排序:
List list = Arrays.asList(3, 1, 2); List sortedList = list.stream().sorted((x, y) -> y - x).collect(Collectors.toList()); System.out.println(sortedList); // 输出[3, 2, 1]
三、进阶用法
1、并行流
Stream可以很方便地实现并行计算,将大大提高处理速度。例如下面的例子中生成1000万个随机数并行求和:
long start = System.currentTimeMillis(); long sum = new Random().ints(10000000).parallel().sum(); long end = System.currentTimeMillis(); System.out.println(sum); // 输出-220402820, 大小不重要 System.out.println("Time: " + (end - start) + " ms"); // 输出执行时间(可能不稳定)
需要注意的是,并行计算不一定总是比串行计算更快,有时因为上下文切换的开销反而会变慢。但是对于较大的数据集来说,并行计算通常更快。
2、收集器
Collectors提供的一些收集器可以方便地将Stream处理结果收集为一个List、Set、Map等数据结构。例如下面的例子中将Stream中所有元素去重并放到Set中:
List list = Arrays.asList(1, 2, 3, 4, 5, 5, 5, 6); Set set = list.stream().distinct().collect(Collectors.toSet()); System.out.println(set); // 输出[1, 2, 3, 4 ,5, 6]
四、总结
Stream是Java编程新的中心之一,它可以让集合处理变得更简单、更快速,提高代码可读性和代码简洁度,大大提高代码质量。在实际开发中,我们可以充分利用Stream提供的基本操作、进阶用法以及收集器等工具来处理各种数据。Stream能够让我们以一种非常自然的方式处理数据,真正实现内部迭代的概念。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/160552.html