java 8 版本之前的并行流语法

parralel stream syntax prior to java 8 release

在 Java8 正式发布之前,当它还在开发中时,我认为获取流和并行流的语法略有不同是正确的。现在我们可以选择说:

stream().parallel()parallelStream()

我记得在它发布之前阅读过教程,当时这里有一个细微的差别 - 谁能提醒我它是什么,因为它一直困扰着我!

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

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

然而,如果您的流源包含中间步骤(例如,考虑 Collections.nCopies implementation which includes map step), the things were worse: using .stream().parallel() would create a new spliterator 和 poor-man 拆分策略(包括缓冲)。因此对于此类收集,使用 .parallelStream() 实际上更好因为它在内部使用 .parallel() before 中间操作。目前即使对于 nCopies() 你也可以交替使用 .stream().parallel().parallelStream()

更倒退,你may notice that .parallelStream() was called simply .parallel() initially. It was renamed in this changeset