【发布时间】:2016-01-20 20:26:22
【问题描述】:
在 Java 8 正式发布之前,当它仍在开发中时,我是否正确地认为获取流和并行流的语法略有不同。现在我们可以选择说:
stream().parallel() 或 parallelStream()
我记得在它发布之前阅读了教程,当时这里有一个细微的差别 - 任何人都可以提醒它是什么,因为它一直困扰着我!
【问题讨论】:
标签: parallel-processing java-8 release java-stream
在 Java 8 正式发布之前,当它仍在开发中时,我是否正确地认为获取流和并行流的语法略有不同。现在我们可以选择说:
stream().parallel() 或 parallelStream()
我记得在它发布之前阅读了教程,当时这里有一个细微的差别 - 任何人都可以提醒它是什么,因为它一直困扰着我!
【问题讨论】:
标签: parallel-processing java-8 release java-stream
当前实现没有区别:.stream() 创建一个管道,其中parallel 字段设置为false,然后.parallel() 只是将此字段设置为 true 并返回相同的对象。使用.parallelStream() 时,它会在构造函数中创建parallel 字段设置为true 的管道。所以两个版本是一样的。随后对.parallel() 或.sequential() 的任何调用只需执行相同操作:将流模式标志更改为true 或false 并返回相同的对象。
Stream API 的早期实现有所不同。 Here's AbstractPipeline 的源代码(所有 Stream、IntStream、LongStream 和 DoubleStream 实现的父代码)在 lambda-dev 中,就在逻辑被更改之前。在从拆分器创建流之后立即将模式设置为parallel() 相对便宜:它只是从原始流(spliteratorSupplier() 中的depth == 0 分支)中提取拆分器,然后在此拆分器的顶部创建一个新流丢弃原始流(那些时候没有close()/onClose(),因此没有必要委托关闭处理程序)。
尽管如此,如果您的流源包含中间步骤(例如,考虑 Collections.nCopies 实现,其中包括 map 步骤),情况会更糟:使用 .stream().parallel() 将 create a new spliterator 与穷人拆分策略(包括缓冲)。因此,对于这样的收集,使用.parallelStream() 实际上更好,因为它在内部使用.parallel() before 中间操作。目前,即使对于 nCopies(),您也可以同时使用 .stream().parallel() 和 .parallelStream()。
再往前走,你 may notice 那个 .parallelStream() 最初被简单地称为 .parallel()。它被重命名为this changeset。
【讨论】:
.parallelStream() 的.parallel() 会更倒退。它被重命名为this changeset。
Stream.parallel() 已经在那里了。新名称确实不那么令人困惑。