Oracle官方文档说:
请注意,如果对并行流使用forEachOrdered等操作,则可能会失去并行性的好处. Oracle - 并行性
forEachOrdered如果我们失去并行性,为什么有人会使用并行流呢?
根据具体情况,使用并不会失去并行性的所有好处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终端操作是非确定性的,因此有一个版本用于顺序流,一个版本专门用于并行流.