我正在学习 Oracle 的 Stream API Java 1.8 类(class),我在仔细阅读讲义时偶然发现了这一点:
unordered():
– Inherited from BaseStream
– Returns a stream that is unordered (used internally)
– Can improve efficiency of operations like distinct() and groupingBy()
这是我的问题。无序的特性如何让distinct()
和groupingBy()
的计算更加高效
最佳答案
它仅在并行流的情况下才有意义。对于有序并行流,distinct()
操作必须做额外的工作才能保证其稳定性,即
for duplicated elements, the element appearing first in the encounter order is preserved
(请参阅 javadoc for Stream.distinct() 中的 API 注释部分。
对于无序并行流,不需要保留这样的保证,因为流已经是无序的。这样,从有序并行流中删除有序特征可以大大提高 distinct()
操作的性能。
同样,对于 groupingBy()
操作,取消保留流顺序的要求可以在并行流的情况下大大提高操作效率,因为归约本身可以同时执行。请注意,只有在使用并发收集器从并行流收集数据时才会发生这种情况,并且收集器或流本身是无序的。实际上,您需要使用 Stream.collect(groupingByConcurrent(..))
而不是 Stream.collect(groupingBy(..))
。请参阅 javadoc Stream.collect()
和 Collector
了解更多详情。
关于java-8 - "unordered"如何帮助 "distinct()"和 "groupingBy",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41364081/