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()
的任何后续调用都只是做同样的事情:将流模式标志更改为 true
或 false
和 return 相同的对象。
Stream API 的早期实现是不同的。 Here's AbstractPipeline
的源代码(所有 Stream
、IntStream
、LongStream
和 DoubleStream
实现的父代码)在 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。
在 Java8 正式发布之前,当它还在开发中时,我认为获取流和并行流的语法略有不同是正确的。现在我们可以选择说:
stream().parallel()
或 parallelStream()
我记得在它发布之前阅读过教程,当时这里有一个细微的差别 - 谁能提醒我它是什么,因为它一直困扰着我!
当前实现没有区别:.stream()
创建一个管道,其中 parallel
字段设置为 false
,然后 .parallel()
仅将此字段设置为 true 和 return 是同一个对象。使用 .parallelStream()
时,它会在构造函数中创建 parallel
字段设置为 true
的管道。所以两个版本是一样的。对 .parallel()
或 .sequential()
的任何后续调用都只是做同样的事情:将流模式标志更改为 true
或 false
和 return 相同的对象。
Stream API 的早期实现是不同的。 Here's AbstractPipeline
的源代码(所有 Stream
、IntStream
、LongStream
和 DoubleStream
实现的父代码)在 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。