Java 8 | Stream 高级用法

前面几篇文章简单介绍了 Stream 的用法,今天整理一下部分高级用法。

方法引用

Lambda 表达式经常会有如下的表达式,只有一条语句,返回某个方法的执行结果。

string -> string.toUpperCase()

Java 8 为这种类型的语句提供了一个简单的写法,也就是方法引用,可以重写为如下的方法引用。

String::toUpperCase

方法引用的标准写法为 ClassName::methodName,后面不需要加括号。方法引用和 lambda 表达式等价,因此可以用 lambda 表达式的地方都可以用方法引用。

同样地,构造函数也可以使用方法引用,如下的 lambda 表达式

text -> new String(text)

可以使用方法引用重写为

String::new

要想理解清楚方法引用,就必须明白这里是一种函数式的编程方法。使用 lambda 表达式的地方并没有立即执行,而是在需要的时候才执行。

元素顺序

元素在 Stream 中一定是有顺序的,但未必与集合中的顺序一致。如果是 List 集合,Stream 在处理的时候会保持元素顺序不变。如果是 Map、Set 集合,集合本身对元素的顺序要求不严格,Stream 在处理的时候不会保证元素顺序。

并行处理

现代计算机单核处理能力已经很难再继续提高,更倾向于往多核方向发展。Stream 为我们提供了利用多核计算能力的方法,可以并行处理流中的数据,提高大数据量的处理速度。

在 Stream 中,使用并行处理很简单。调用 Stream 的 parallel 方法或者集合的 parallelStream 方法可以得到一个并行处理的 Stream,其他的方法调用和操作不用改变。Stream 为我们屏蔽了并行的底层操作。

Stream<String> stream = Stream.of("a","b","c");
List<String> upperList = stream.parallel()
    .map(String::toUpperCase)
    .collect(Collectors.toList());

List<Integer> list = Arrays.asList(1,2,3,4,5);
List<Integer> res = list.parallelStream()
    .filter(value -> value > 2)
    .collect(Collectors.toList());

并行处理数组

Java 8 还为数组提供了并行处理的方法,这些方法加在 Arrays 工具类上。方法列表如下:

Arrays.parallelPrefix:任意给定一个函数,计算数组的和;

Arrays.parallelSetAll:使用 Lambda 表达式更新数组元素;

Arrays.parallelSort:数组排序。

下面演示一下如何使用这些方法。在下面的代码中,先用 parallelSetAll 方法初始化数组,填充随机数;然后调用 parallelSort 方法并行排序;最后调用 parallelPrefix 方法,使用 Integer::sum 方法引用,计算出数组的和。

int[] array = new int[10];
//初始化 Arrays.parallelSetAll(array, i -> new Random().nextInt(100));
System.out.println(Arrays.toString(array));
//排序 Arrays.parallelSort(array);
System.out.println(Arrays.toString(array));
//累加 Arrays.parallelPrefix(array, Integer::sum);
System.out.println(Arrays.toString(array));

上述代码的一次运行结果如下,填充随机数、排序和求和的结果符合预期。

[77, 27, 94, 95, 11, 30, 46, 96, 45, 17]
[11, 17, 27, 30, 45, 46, 77, 94, 95, 96]
[11, 28, 55, 85, 130, 176, 253, 347, 442, 538]

每周 3 篇学习笔记或技术总结,面向有一定基础的 Java 程序员,内容涉及 Java 进阶、虚拟机、MySQL、NoSQL、分布式计算、开源框架等多个领域。关注作者或微信公众号 后端开发那点事儿 第一时间获取最新内容。

    原文作者:程序之心 丁仪
    原文地址: https://zhuanlan.zhihu.com/p/28300017
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞