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

时间:2016-12-28 14:30:10

标签: java-8 distinct grouping java-stream unordered

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

  

无序():

     

- 继承自BaseStream

     

- 返回无序的流(在内部使用)

     

- 可以提高distinct()和groupingBy()

等操作的效率

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

1 个答案:

答案 0 :(得分:3)

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

  

对于重复元素,元素首先出现在遭遇中   订单保留

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

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

类似地,对于groupingBy()操作,提出应保留流顺序的要求可以在并行流的情况下极大地提高操作的效率,因为可以同时执行缩减本身。请注意,这只会在使用并发收集器从并行流中收集时发生,收集器或流本身是无序的。实际上,您需要使用Stream.collect(groupingByConcurrent(..))代替Stream.collect(groupingBy(..))。有关更多详细信息,请参阅Stream.collect()Collector的javadoc。