Lambda表达式可并行性
今天补充Lambda
表达式知识的时候,有一个可并行性
的特性:
// 使用 Lambda 表达式和 Stream API 进行并行计算
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.parallelStream().mapToInt(Integer::intValue).sum();
上面的代码中,使用Lambda
表达式结合了Stream API
进行并行计算操作。
下面详细解释一下这两行代码:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
建立一个列表 numbers
int sum = numbers.parallelStream().mapToInt(Integer::intValue).sum();
.parallelStream()
对numbers数组进行流处理,创建一个并行流,下面的操作会分在多个线程上进行执行,提高执行效率。
.mapToInt(Integer::intValue)
该方法将所有的Integer对象转化成int基本数据类型,Integer::intValue
是一个方法调用,表示调用Integer对象的intValue方法。
.sum()
对所有的元素进行求和。
补充:
并行流的操作主要在 中间操作 和 终端操作 过程中。
并行流处理的步骤:
- 创建并行流,例如:.parallelStream()
- 中间操作,例如:.mapToInt()
- 终端操作,例如:.sum()
并行流处理的三个阶段(对应三个步骤):
- 源数据拆分:流转化成并行流的时候,任务会被拆分成多个子任务,多个子任务均匀分配给多个线程
- 并行处理:并行执行一些列的中间操作,比如过滤、映射、排序等操作
- 结果合并:通过终端操作(比如collect、reduce、forEach等)将每个子任务的结果合成一个结果集。
再看一个例子:
List<Integer> numbers = Array.asList(1,2,3,4,5);
List<Integer> result = numbers.paralleStream()
// 中间操作:过滤偶数、数字乘2
.filter(n-> n % 2 == 0)
.map(n -> n * 2)
// 终端操作:将结果收集到一个List里
.collect(collector.toList());
rds_blogs