使用 forEach 的好处与并行流一起排序
官方的甲骨文文档说:
请注意,如果使用 forEachOrdered 等与并行流类似的操作,则可能会失去并行性的优势。甲骨文 - 并行性
如果我们失去并行性,为什么有人会使用并行流?forEachOrdered
官方的甲骨文文档说:
请注意,如果使用 forEachOrdered 等与并行流类似的操作,则可能会失去并行性的优势。甲骨文 - 并行性
如果我们失去并行性,为什么有人会使用并行流?forEachOrdered
根据具体情况,使用 不会失去并行性的所有优点。ForEachOrdered
假设我们有这样的东西:
stringList.parallelStream().map(String::toUpperCase)
.forEachOrdered(System.out::println);
在这种情况下,我们可以保证终端操作将按照 encounter 顺序以大写形式打印出字符串,但我们不应该假设元素将按照选取进行处理的相同顺序传递给中间操作。该操作将由多个线程同时执行。因此,人们可能仍然受益于并行性,但这只是我们没有充分利用并行性的全部潜力。总而言之,我们应该在重要的时候按照流的遭遇顺序执行操作。ForEachOrdered
map
map
ForEachOrdered
在您的评论后编辑:
跳过操作时会发生什么情况?我更感兴趣的是马上之后
map
forEachOrdered
parallelStream()
如果您指的是以下内容:
stringList.parallelStream().forEachOrdered(action);
做这样的事情没有任何好处,我怀疑这是设计师在决定创建方法时所想到的。在这种情况下,这样做更有意义:
stringList.stream().forEach(action);
扩展您的问题“如果我们失去并行性,为什么有人会使用forEachOrdered与并行流”,假设您想对每个元素执行有关流遇到顺序的操作;在这种情况下,您将需要使用,因为并行使用时终端操作是非确定性的,因此有一个用于顺序流的版本和一个专门用于并行流的版本。forEachOrdered
forEach
我真的不明白这个问题。为什么?因为你根本没有替代方案 - 你有这么多的数据,并行流会帮助你(这仍然需要证明);但是,您仍然需要保持顺序 - 因此.请注意,文档说可能会和不会肯定会丢失 - 你必须测量和查看。forEachOrdered