“无序”如何帮助“distinct()”和“groupingBy”

GA1*_*GA1 2 grouping distinct unordered java-8 java-stream

我正在学习 Oracle 的 Stream API Java 1.8 课程,在阅读讲义时偶然发现了这一点:

无序():

– 继承自 BaseStream

– 返回一个无序的流(内部使用)

– 可以提高distinct()和groupingBy()等操作的效率

这是我的问题。无序的属性如何导致更有效的计算distinct()groupingBy()

Nán*_*ete 5

它仅在并行流的情况下才有意义。在有序并行流的情况下,distinct()操作必须做额外的工作以保持其稳定性保证,即,

对于重复元素,保留遇到顺序中最先出现的元素

(请参阅Stream.distinct()javadoc 中的 API Note 部分。

在无序并行流的情况下,不需要保持这样的保证,因为流已经是无序的。这样,从有序并行流中去除有序特征可以大大提高distinct()操作的性能。

类似地,对于groupingBy()操作来说,在并行流的情况下,取消保留流顺序的要求可以大大提高操作的效率,因为减少本身可以并发执行。请注意,这只会在使用并发收集器从并行流中收集时发生,收集器或流本身是无序的。实际上,您需要使用Stream.collect(groupingByConcurrent(..))代替Stream.collect(groupingBy(..)). 查看javadoc了解Stream.collect()Collector更多的细节。