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()对所有的元素进行求和。

补充:
并行流的操作主要在 中间操作 和 终端操作 过程中。

并行流处理的步骤:

  1. 创建并行流,例如:.parallelStream()
  2. 中间操作,例如:.mapToInt()
  3. 终端操作,例如:.sum()

并行流处理的三个阶段(对应三个步骤):

  1. 源数据拆分:流转化成并行流的时候,任务会被拆分成多个子任务,多个子任务均匀分配给多个线程
  2. 并行处理:并行执行一些列的中间操作,比如过滤、映射、排序等操作
  3. 结果合并:通过终端操作(比如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());
posted @ 2024-07-02 09:46  r涤生  阅读(11)  评论(0编辑  收藏  举报