我正在处理 Java 8 并行流,希望以某种顺序(例如插入顺序、反向顺序或顺序顺序)打印并行流中的元素。
为此,我尝试了以下代码:
System.out.println("With forEachOrdered:");
listOfIntegers
.parallelStream()
.forEachOrdered(e -> System.out.print(e + " "));
System.out.println("");
System.out.println("With Sequential:");
listOfIntegers.parallelStream()
.sequential()
.forEach(e -> System.out.print(e + " "));
对于这两个问题,我得到了相同的输出结果,如下所示:
With forEachOrdered:
1 2 3 4 5 6 7 8
With Sequential:
1 2 3 4 5 6 7 8
从API文档中,我可以看到:
forEachOrdered -> 这是一个终端操作。
以及
sequential -> 这是一个中间操作。
那么我的问题是哪个更好使用?在什么情况下,应该优先选择其中之一?
list.parallelStream().sorted().forEachOrdered(…)
视为一种实际的示例,它可以并行进行大量工作,但是终端操作需要有序。 - Holger.parallelStream(). … .forEachOrdered(…)
和.parallelStream(). … sequential().forEach(…)
会产生明显的差异。正如你所说,“流是惰性求值的”,因此如果终端操作由于排序约束而阻塞了工作线程,则除非你有像sorted()
这样的有状态中间操作,否则并没有太多并行性。 - Holger