使用带有并行流的forEachOrdered的好处

Sag*_*gar 9 java java-8

Oracle官方文档说:

请注意,如果对并行流使用forEachOrdered等操作,则可能会失去并行性的好处. Oracle - 并行性

forEachOrdered如果我们失去并行性,为什么有人会使用并行流呢?

Ous*_* D. 9

根据具体情况,使用并不会失去并行性的所有好处ForEachOrdered.

假设我们有这样的东西:

stringList.parallelStream().map(String::toUpperCase)
                           .forEachOrdered(System.out::println);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们可以保证ForEachOrdered终端操作将在遭遇顺序中以大写形式打印出字符串,我们不应该假设元素将map按照它们被选择进行处理的相同顺序传递给中间操作.该map操作将由多个线程同时执行.所以人们仍然可以从并行性中受益,但这只是我们没有充分发挥并行性的潜力.总而言之,我们应该ForEachOrdered在重要的时候使用在流的遭遇顺序中执行操作.

编辑以下评论:

跳过map操作会发生什么?我更感兴趣的是 forEachOrdered右后parallelStream()

如果你指的是:

 stringList.parallelStream().forEachOrdered(action);
Run Code Online (Sandbox Code Playgroud)

没有好处在做这样的事情,我怀疑这就是设计师有什么考虑时,他们决定建立的方法.在这种情况下,做更有意义的事情:

stringList.stream().forEach(action);
Run Code Online (Sandbox Code Playgroud)

扩展你的问题"如果我们失去并行性,为什么有人会使用forEachOrdered和并行流",说你想对每个元素执行一个关于流遇到顺序的动作; 在这种情况下,您将需要使用, forEachOrdered因为并行使用时forEach终端操作是非确定性的,因此有一个版本用于顺序流,一个版本专门用于并行流.

  • 一个更有趣的例子是`stringList.parallelStream().sorted().forEachOrdered(action)` (2认同)