Java 8的forEachOrdered()和sequential()方法之间的区别?

Kay*_*ayV 5 java parallel-processing java-8 java-stream

我正在研究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 + " "));
Run Code Online (Sandbox Code Playgroud)

对于这两个,我得到相同的输出如下:

With forEachOrdered:
1 2 3 4 5 6 7 8 
With Sequential:
1 2 3 4 5 6 7 8 
Run Code Online (Sandbox Code Playgroud)

从api文档中,我可以看到:

forEachOrdered - >这是一个终端操作.

顺序 - >这是一个中间操作.

所以我的问题是哪一个更好用?在哪种情况下,一个应该优先于其他情况?

Era*_*ran 5

listOfIntegers.parallelStream().sequential().forEach()创建一个并行Stream,然后将其转换为sequence Stream,因此您最好使用它listOfIntegers.stream().forEach(),并首先获取一个sequence Stream

listOfIntegers.parallelStream().forEachOrdered(e -> System.out.print(e + " "))在parallel上执行操作Stream,但保证元素将按的遇到顺序被消耗Stream(如果Stream具有已定义的遇到顺序)。但是,它可以在多个线程上执行。

我看不出有使用过的原因listOfIntegers.parallelStream().sequential()。如果要顺序操作Stream,为什么Stream要先创建并行操作?

  • 考虑将`list.parallelStream()。sorted()。forEachOrdered(…)`作为一个实际示例,该示例并行执行繁重的工作,但执行有序的终端操作。 (4认同)
  • 究竟。这是`.parallelStream()操作的示例。….forEachOrdered(…)`和`.parallelStream()。…sequence()。forEach(…)`表现出明显的差异。如您所说,“流是惰性计算的”,因此,如果终端操作由于排序约束而阻塞了工作线程,那么除非拥有诸如`sorted()`之类的有状态中间操作,否则您不会获得太多的并行性。 (4认同)