2016-12-28 43 views
2

我做Oracle的流API的Java 1.8當然,我偶然發現了這個在應聘一個講義:「無序」如何幫助「不同的()」和「groupingBy」

無序():

- 從BaseStream

繼承 - 返回流,其是無序的(內部使用)

- 可以提高像不同)操作的效率(與groupingBy()

這是我的問題。無序的性質如何導致更高效的計算distinct()groupingBy()

回答

3

它只有在平行流的情況下才有意義。在有序的並行數據流的情況下,distinct()操作必須做額外的工作,以保持它的穩定性保證,那就是

的重複元素,在遭遇 順序首先出現的元素被保留

(參見API注部在javadoc for Stream.distinct()

在無序並行流的情況下,沒有這樣的保證需要保持,作爲流已經是無序的。這樣,從一個有序paralle去除的有序特性l流可以大大提高distinct()操作的性能。

同樣,對於groupingBy()操作,由於降低本身可以同時執行,因此解決流順序應該保留的要求可以大大提高並行流操作的效率。請注意,這隻會在收集具有併發收集器的並行流時發生,收集器或流自身無序。實際上,您需要使用Stream.collect(groupingByConcurrent(..))而不是Stream.collect(groupingBy(..))。有關更多詳細信息,請參閱javadoc的Stream.collect()Collector