java - 将 forEachOrdered 与并行流一起使用的好处

标签 java java-8

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 in forEachOrdered right after parallelStream()

如果您指的是以下内容:

 stringList.parallelStream().forEachOrdered(action);

做这样的事情没有任何好处,我怀疑设计者在决定创建该方法时的想法是什么。在这种情况下,这样做会更有意义:

stringList.stream().forEach(action);

为了扩展您的问题“如果我们正在失去并行性,为什么会有人将 forEachOrdered 与并行流一起使用”,假设您想根据流遇到的顺序对每个元素执行一个操作;在这种情况下,您将需要使用 forEachOrdered,因为 forEach 终端操作在并行使用时是非确定性的 因此有一个版本用于顺序流,一个专门用于并行流。

关于java - 将 forEachOrdered 与并行流一起使用的好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47336825/

相关文章:

session - Vaadin Framework 7 中 session 超时的不规则性

java - 如何使用compareToIgnoreCase

java - 如何将一个对象列表添加到另一个列表中

java - Maven 干净安装 jar 和 war

java - 在 Java 8 中将字符串转换为 Map<Integer,String>

java - 关于 lambda 语法

java - Java 8 Collector UNORDERED 特性是什么意思?

java - createQuery 与 createNativeQuery,更新/删除语句的性能差异

Java 8 根据条件应用流过滤器

java - 在引用中存储接受参数的构造函数