gpt4 book ai didi

.map 返回的 Java-8 Stream 是并行的还是顺序的?

转载 作者:搜寻专家 更新时间:2023-11-01 02:05:38 31 4
gpt4 key购买 nike

mapmapToObj 方法返回的

Stream 始终是顺序的,还是取决于调用流的状态是否并行?

IntStream 的文档没有明确回答这个问题,或者我无法正确理解:

我想知道来自以下示例的我的流是否会并行到最后,或者它会在某个时候发生变化。

IntStream.range(1, array_of_X.size())
.parallel()
.mapToObj (index -> array_of_X.get(index)) // mapping#1
.filter (filter_X)
.map (X_to_Y) //mapping#2
.filter (filter_Y)
.mapToInt (obj_Y_to_int) //mapping#3
.collect(value -> Collectors.summingInt(value));

最佳答案

不,它永远不会改变(除非你自己明确地改变它)。

您编写的内容对应于 Stream 管道,单个管 Prop 有单一方向:并行或顺序。所以不存在“并行到最后”,因为整个流水线要么并行执行,要么顺序执行。

引用Stream package Java文档:

The only difference between the serial and parallel versions of this example is the creation of the initial stream, using "parallelStream()" instead of "stream()". When the terminal operation is initiated, the stream pipeline is executed sequentially or in parallel depending on the orientation of the stream on which it is invoked. Whether a stream will execute in serial or parallel can be determined with the isParallel() method, and the orientation of a stream can be modified with the BaseStream.sequential() and BaseStream.parallel() operations. When the terminal operation is initiated, the stream pipeline is executed sequentially or in parallel depending on the mode of the stream on which it is invoked.

这意味着 Stream 管道改变其方向的唯一方法是调用 sequential() 之一。或 parallel()方法。由于这对 Stream API 是全局的,因此并不是为每个操作编写的,而是在 Javadoc 包中编写的。

使用您问题中的代码,Stream 管道将并行执行,因为您通过调用 parallel() 明确更改了 Stream 方向。


请务必注意,流的最终方向将是对 parallel()sequential()最后调用.考虑以下三个示例:

public static void main(String[] args) {
System.out.println(IntStream.range(0, 10).isParallel());
System.out.println(IntStream.range(0, 10).parallel().isParallel());
System.out.println(IntStream.range(0, 10).parallel().map(i -> 2*i).sequential().isParallel());
}
  1. 第一个将打印 false 因为 IntStream.range 返回顺序流
  2. 第二个将打印 true 因为我们调用了 parallel()
  3. 第三个将打印 false 因为,即使我们在管道中调用了 parallel(),我们之后调用了 sequential() 所以它将 Stream 管道的总方向重置为串行。

请注意,仍然引用:

The stream implementations in the JDK create serial streams unless parallelism is explicitly requested.

因此,除非您明确请求并行流,否则您要检索的每个流都将是顺序的。

关于.map 返回的 Java-8 Stream 是并行的还是顺序的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34710946/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com