【问题标题】:parralel stream syntax prior to java 8 releasejava 8 版本之前的并行流语法
【发布时间】:2016-01-20 20:26:22
【问题描述】:

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

stream().parallel()parallelStream()

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

【问题讨论】:

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


    【解决方案1】:

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

    Stream API 的早期实现有所不同。 Here's AbstractPipeline 的源代码(所有 StreamIntStreamLongStreamDoubleStream 实现的父代码)在 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

    【讨论】:

    • 但是在语法上也没有细微的差别 - 我记得读过一些建议这已经或正在为最终版本进行更改的内容,因此例如您可以调用 collection.stream() 或collection.parallel() 并将其更改为 collection.parallelStream() 和 stream().parallel()。这只是一个例子,但我认为是这样的......
    • 好吧,如果您要问这个问题,那么您may notice 最初称为.parallelStream().parallel() 会更倒退。它被重命名为this changeset
    • 是的!让我发疯,因为我知道有变化。那么当它曾经被称为 .parallel() 而不是 .parallelStream() 时,还有 stream().parallel(),即将顺序流更改为并行的方法吗?如果是这样,我想这就是他们改变它的原因,因为在这个意义上存在冲突,现在更加明显。
    • @user3780370,是的,Stream.parallel() 已经在那里了。新名称确实不那么令人困惑。
    猜你喜欢
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 2016-02-28
    • 2018-07-31
    • 1970-01-01
    • 2019-08-01
    相关资源
    最近更新 更多