在我看来,在使用Java8Stream
时,无论是“对象”流还是原始流(即IntStream
和朋友),最明显的代码都是使用:
someStreamableResource.stream().whatever()
但是,相当多的“流媒体资源”也有.parallelStream()
。
在读取javadoc时,不清楚的是.stream()
流是否总是顺序的,以及.parallelStream()
流是否总是并行的……
然后是Spliterator
,特别是它的.characteristics()
,其中之一是它可以是CONCURRENT
,甚至是IMMUTABLE
。
我的直觉是,事实上,默认情况下,Stream
是否可以并行,或者根本就是并行,都是由它的底层Spliterator
决定的……
我在正确的轨道上吗?我已经读了一遍又一遍javadoc,但仍然不能给这个问题一个明确的答案……
发布于 2015-01-15 03:06:47
首先,通过镜头的规范。流是并行的还是顺序的是流状态的一部分。流创建方法应该指定它们是创建顺序流还是并行流( JDK中的大多数都是这样做的),但并不要求它们这样做。如果您的流来源没有说明,请不要假设。如果有人给你传了一条流,不要假设。
并行流可以根据自己的判断退回到顺序实现(因为顺序实现是并行实现,只是潜在的不完美实现);相反的情况并非如此。
现在,通过实现的镜头。在Collections和其他JDK类中的流创建方法中,我们坚持“创建顺序流,除非用户显式要求并行性”的原则。(然而,其他库做出了不同的选择。如果他们有礼貌,他们会明确自己的行为。)
流并行和Spliterator之间的关系只有一个方向。Spliterator可以拒绝拆分--有效地拒绝任何并行性--但它不能要求客户端拆分它。因此,一个不合作的拆分器可以破坏并行性,但不能确定它。
https://stackoverflow.com/questions/27934587
复制相似问题