我做Oracle的流API的Java 1.8當然,我偶然發現了這個在應聘一個講義:「無序」如何幫助「不同的()」和「groupingBy」
無序():
- 從BaseStream
繼承 - 返回流,其是無序的(內部使用)
- 可以提高像不同)操作的效率(與groupingBy()
這是我的問題。無序的性質如何導致更高效的計算distinct()
和groupingBy()
我做Oracle的流API的Java 1.8當然,我偶然發現了這個在應聘一個講義:「無序」如何幫助「不同的()」和「groupingBy」
無序():
- 從BaseStream
繼承 - 返回流,其是無序的(內部使用)
- 可以提高像不同)操作的效率(與groupingBy()
這是我的問題。無序的性質如何導致更高效的計算distinct()
和groupingBy()
它只有在平行流的情況下才有意義。在有序的並行數據流的情況下,distinct()
操作必須做額外的工作,以保持它的穩定性保證,那就是
的重複元素,在遭遇 順序首先出現的元素被保留
(參見API注部在javadoc for Stream.distinct()。
在無序並行流的情況下,沒有這樣的保證需要保持,作爲流已經是無序的。這樣,從一個有序paralle去除的有序特性l流可以大大提高distinct()
操作的性能。
同樣,對於groupingBy()
操作,由於降低本身可以同時執行,因此解決流順序應該保留的要求可以大大提高並行流操作的效率。請注意,這隻會在收集具有併發收集器的並行流時發生,收集器或流自身無序。實際上,您需要使用Stream.collect(groupingByConcurrent(..))
而不是Stream.collect(groupingBy(..))
。有關更多詳細信息,請參閱javadoc的Stream.collect()
和Collector
。