在Java 8正式发布之前,当它仍处于开发阶段时,我认为获取流和并行流的语法略有不同。现在我们可以选择说:
stream().parallel()
或parallelStream()
我记得在发布之前阅读教程时,这里有一个微妙的区别 - 任何人都可以提醒它是什么,因为它一直困扰着我!
答案 0 :(得分:3)
当前实现没有区别:.stream()
创建一个parallel
字段设置为false
的管道,然后.parallel()
只将此字段设置为true并返回相同的对象。使用.parallelStream()
时,它会在构造函数中创建parallel
字段设置为true
的管道。所以两个版本都是一样的。对.parallel()
或.sequential()
的任何后续调用都会执行相同操作:将流模式标记更改为true
或false
并返回相同的对象。
Stream API的早期实现是不同的。 AbstractPipeline
lambda-dev中Stream
的源代码(所有IntStream
,LongStream
,DoubleStream
和parallel()
实现的父代)逻辑改变了。在从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中重命名。