java 8发布之前的parralel流语法

时间:2016-01-20 20:26:22

标签: parallel-processing java-8 release java-stream

在Java 8正式发布之前,当它仍处于开发阶段时,我认为获取流和并行流的语法略有不同。现在我们可以选择说:

stream().parallel()parallelStream()

我记得在发布之前阅读教程时,这里有一个微妙的区别 - 任何人都可以提醒它是什么,因为它一直困扰着我!

1 个答案:

答案 0 :(得分:3)

当前实现没有区别:.stream()创建一个parallel字段设置为false的管道,然后.parallel()只将此字段设置为true并返回相同的对象。使用.parallelStream()时,它会在构造函数中创建parallel字段设置为true的管道。所以两个版本都是一样的。对.parallel().sequential()的任何后续调用都会执行相同操作:将流模式标记更改为truefalse并返回相同的对象。

Stream API的早期实现是不同的。 AbstractPipeline lambda-dev中Stream的源代码(所有IntStreamLongStreamDoubleStreamparallel()实现的父代)逻辑改变了。在从spliterator创建流之后立即将模式设置为depth == 0相对便宜:它只是从原始流(spliteratorSupplier()中的close()/onClose()分支)中提取spliterator,然后创建一个新流在这个分裂者的顶部丢弃原始流(那些时候没有map,因此没有必要委托关闭处理程序)。

然而,如果您的流源包含中间步骤(例如,考虑包含.stream().parallel()步骤的Here's实施),情况会更糟:使用.parallelStream() Collections.nCopies穷人分裂策略(包括缓冲)。因此,使用.parallel()进行此类收集实际上更好,因为它在中间操作之前在内部使用nCopies() 。目前即使是.stream().parallel(),您也可以互换使用.parallelStream().parallelStream()

更加向后,.parallel()最初只调用了{{1}} {{1}} {{1}}。它已在create a new spliterator中重命名。