并行流中的流操作等待直到前一个流操作处理完所有元素

Tit*_*lum 3 java parallel-processing java-8 java-stream

我想知道并行流的流管道中的流操作是否等待前一个流操作完成所有流元素的处理。

如果我有以下流管道:

List <String> parsedNumbers = IntStream.range(1, 6)
    .parallel()
    .map(String::valueOf)
    .map(integerAsString => {
        System.out.println("First print statement: " + integerAsString);
        return integerAsString;
    })
    .map(integerAsString => {
        System.out.println("Second print statement: " + integerAsString);
        return integerAsString;
    })
    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

是否可能System.out.println("First print statement: " + integerAsString)已经为元素 X 调用了该String::parseInt操作,但仍在为流中的另一个元素 Y 执行操作?

可以此代码的输出如下所示:

第一个打印语句:1
第一个打印语句:2
第一个打印语句:3
第二个打印语句:1
第二个打印语句:2
第一个打印语句:4
第二个打印语句:3
第二个打印语句:4
第一个打印语句:5
第二个打印语句:5

会不会永远是这样:

第一个打印语句:1
第一个打印语句:2
第一个打印语句:3
第一个打印语句:4
第一个打印语句:5
第二个打印语句:1
第二个打印语句:2
第二个打印语句:3
第二个打印语句:4
第二个打印语句:5

Eug*_*ene 5

是的,它可以。Intermediate阶段可以按任何顺序执行,terminal操作有一个定义的顺序,如果流的源有一个顺序(Set例如不像 a )并且流本身不改变该顺序(调用unordered- 尽管目前这并没有做太多)。

也就是说:您并不真正知道在给定的时间点哪个元素将流经其中一个阶段,对于并行流如何处理元素没有顺序。

更大的问题是你为什么关心?中间操作应该是没有副作用的,依赖任何顺序都是一个坏主意。