在处理Java 8流管道时,对顺序()和并行()的调用顺序是否重要?

Raf*_*ian 10 java parallel-processing java-stream

调用sequential()parallel()更改Java 8流管道的执行方式是否放置?

例如,假设我有这样的代码:

new ArrayList().stream().parallel().filter(...).count();
Run Code Online (Sandbox Code Playgroud)

在这个例子中,很明显filter()将并行运行.但是,如果我有这个代码怎么办:

new ArrayList().stream().filter(...).parallel().count();
Run Code Online (Sandbox Code Playgroud)

是否filter()在并行运行仍然还是它按顺序运行?之所以不清楚是因为中间操作filter()是懒惰的,即它们不会在调用终端操作之前运行count().因此,在count()调用时,我们有一个并行流管道但是filter()顺序执行,因为它调用之前到来了parallel()

Hol*_*ger 10

注意结束Stream的类的文档:

流管道可以顺序执行或并行执行.此执行模式是流的属性.通过初始选择的顺序或并行执行来创建流.(例如,Collection.stream()创建一个顺序流,Collection.parallelStream()创建一个并行流.)这种执行模式的选择可以通过BaseStream.sequential()或BaseStream.parallel()方法修改,并且可以使用BaseStream.isParallel()方法查询.

换句话说,在终端操作开始时调用sequential()parallel()仅改变流的属性及其状态确定整个流水线的执行模式.

这可能没有明确记录在所有地方,因为,并非总是如此.在早期开发中,有些原型具有不同的阶段模式.2013年3月的这封邮件解释了这一变化.