Oracle 官方文档说:
Note that you may lose the benefits of parallelism if you use operations like forEachOrdered with parallel streams. Oracle - Parallelism
如果我们失去了并行性,为什么会有人将 forEachOrdered
与并行流一起使用?
最佳答案
根据情况,使用 ForEachOrdered
并不会失去所有并行性的好处。
假设我们有这样的东西:
stringList.parallelStream().map(String::toUpperCase)
.forEachOrdered(System.out::println);
在这种情况下,我们可以保证 ForEachOrdered
终端操作将按遇到顺序打印出大写的字符串但是我们不应该假设元素将是传递给 map
中间操作的顺序与它们被挑选出来进行处理的顺序相同。 map
操作将由多个线程同时执行。因此,人们可能仍会从并行性中获益,但这只是我们没有充分利用并行性的全部潜力。总而言之,我们应该在需要按照流的遇到顺序执行操作时使用ForEachOrdered
。
根据您的评论进行编辑:
What happens when you skip
map
operation? I am more interested inforEachOrdered
right afterparallelStream()
如果您指的是以下内容:
stringList.parallelStream().forEachOrdered(action);
做这样的事情没有任何好处,我怀疑设计者在决定创建该方法时的想法是什么。在这种情况下,这样做会更有意义:
stringList.stream().forEach(action);
为了扩展您的问题“如果我们正在失去并行性,为什么会有人将 forEachOrdered 与并行流一起使用”,假设您想根据流遇到的顺序对每个元素执行一个操作;在这种情况下,您将需要使用 forEachOrdered
,因为 forEach
终端操作在并行使用时是非确定性的 因此有一个版本用于顺序流,一个专门用于并行流。
关于java - 将 forEachOrdered 与并行流一起使用的好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47336825/