Streams - parallel() + skip()不显示元素



我对以下两个代码有疑问。

没有并行性:

Stream.of(1, 2, 3)
.peek(System.out::println)
.skip(1)
.map(n-> n * 10)
.forEach(System.out::println);

输出为:

1
2
20
3
30

与并行性:

Stream.of(1, 2, 3)
.parallel()
.peek(System.out::println)
.skip(1)
.map(n-> n * 10)
.forEach(System.out::println);

输出是:

2
3
20
30

为什么不平行流的输出包括1

?

skip()没有问题,您要求跳过1元素,它总是这样做。Stream.of()创建的流是有序的,skip()保证了总是考虑遇到顺序。

不仅被限制跳过任何n元素,而且第一个n元素的相遇顺序。

因为我们在输出中没有看到10,这就证明skip()正确地完成了它的工作——元素1从未到达终端操作。

peek()没有并行输出(1没有打印)。

此方法通过副作用操作,根据API说明"存在主要是为了支持调试">。与forEach()/forEachOrdered()相反,它是一个中间操作,并不意味着执行结果操作。API文档警告它可能被省略,你不应该依赖它。

副作用的消除也可能令人惊讶。除了终端操作forEachforEachOrdered之外,当流实现可以优化执行时,行为参数的副作用可能并不总是执行。,而不影响结果

最新更新