我对以下两个代码有疑问。
没有并行性:
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文档警告它可能被省略,你不应该依赖它。
副作用的消除也可能令人惊讶。除了终端操作
forEach
和forEachOrdered
之外,当流实现可以优化执行时,行为参数的副作用可能并不总是执行。,而不影响结果