2017-05-05 32 views
6

我一直對Collections.parallelStream()Collections.stream().parallel()之間的區別感到好奇。根據Javadocs,parallelStream()嘗試返回並行流,而stream().parallel()返回並行流。通過對我自己的一些測試,我發現沒有區別。這兩種方法的區別在哪裏?一個實現比另一個實現更有效嗎?謝謝。parallelStream vs stream.parallel

+11

簡答:沒有區別。長答案:沒有差別。他們只是彼此的別名。 –

+0

我只是找到了一些東西,我不知道它是否代表它們的區別?請參閱http://stackoverflow.com/questions/44013553/when-calculate-ab-why-parallel-not-work-but-parallelstream-could – zhuguowei

回答

4

即使它們在時刻的行爲相同也有區別 - 至少在您正確指出的文檔中有所不同;據我所知,未來可能會被利用。

目前的parallelStream方法在Collection接口定義爲:

default Stream<E> parallelStream() { 
    return StreamSupport.stream(spliterator(), true); 
} 

作爲一個默認的方法可能在實現覆蓋(這就是Collections內部類實際上做)。

暗示即使默認方法返回並行流,也可能有集合重寫此方法以返回non-parallel Stream。這就是文檔可能是這樣的原因。

同時甚至parallelStream回報順序數據流 - 它仍然是一個Stream;然後你可以輕鬆地調用parallel它:

Collections.some() 
     .parallelStream() // actually sequential 
     .parallel() // force it to be parallel 

至少對我來說,這看起來很奇怪。

似乎文檔應該在某種程度上聲明,在調用parallelStream之後,應該沒有理由再次調用parallel來強制這樣做 - 因爲它可能對處理沒有用,甚至不好處理。

編輯

對於任何閱讀 - 請閱讀由霍爾格也的意見;它涵蓋的內容超出了我在這個答案中所說的內容。

+0

很難想象一個場景,它是合理的流*源*拒絕流的並行處理,而不知道將要鏈接的實際操作。也許,如果它在自己的'Stream' API中實現,那麼它完全控制了調用'.parallel()'時會發生什麼...... – Holger

+0

@Holger我沒有看到*可能是連續的部分*要麼。我也承認,看到一個不會從並行處理中受益的集合將是非常酷的。 – Eugene

+0

那麼,一個空集合永遠不會受益於並行處理,但是,由於無論如何都不能保證線程的數量,所以仍然不讓'isParallel()'返回'true'。同樣,一個沒有'flatMap'操作的singleton集合中的流將永遠不會使用第二個線程,但是'isParallel()'返回'true'沒有任何壞處。這也適用於其底層分割器在'trySplit'中返回'null'的所有流;沒有像'sorted'或'flatMap'這樣的東西,不管你調用'.parallel()';它不會有任何影響。 – Holger

3

Collections.parallelStream()Collections.stream().parallel()之間沒有區別。它們都會將流分割到底層分割器允許的範圍內,並且它們都將使用默認的ForkJoinPool運行(除非已經在另一個內部運行)。

相關問題