Java 8`Stream`可以并行,你甚至不需要它吗?

fge*_*fge 20 java java-8 java-stream

在我看来,明显的代码,当使用Java 8时Stream,无论它们是"对象"流还是原始流(即IntStream和朋友)都只是使用:

someStreamableResource.stream().whatever()
Run Code Online (Sandbox Code Playgroud)

但是,相当多的"可流动资源"也有.parallelStream().

读取javadoc时不清楚的是.stream()流是否始终是顺序的,以及.parallelStream()流是否始终是并行的...

然后有Spliterator,特别是它.characteristics(),其中一个是它可以CONCURRENT,甚至IMMUTABLE.

我的直觉是,事实上,Stream默认情况下是否可以并行,或者根本不是并行,是由其潜在的Spliterator...

我是在正确的轨道上吗?我已经阅读并再次阅读了javadocs,但仍然无法对这个问题做出明确答案......

Bri*_*etz 14

首先,通过规范的镜头.流是并行还是顺序是流的状态的一部分.流创建方法应该指定它们是创建顺序流还是并行流(并且在JDK中大多数都是这样),但是它们不需要这样说.如果您的流源没有说,请不要假设.如果有人通过你的流,不要假设.

允许并行流自行决定回退到顺序流(因为顺序实现并行实现,只是一个可能不完美的实现); 相反的情况并非如此.

现在,通过实施的镜头.在Collections和其他JDK类的流创建方法中,我们坚持"创建顺序流,除非用户明确要求并行"的规则.(然而,其他图书馆做出了不同的选择.如果他们有礼貌,他们会指明他们的行为.)

流并行性和Spliterator之间的关系只有一个方向.Spliterator可以拒绝拆分 - 有效地拒绝任何并行性 - 但它不能要求客户端拆分它.因此,不合作的Spliterator会破坏并行性,但不能确定它.