在Aggregating with Streams中,Brian Goetz比較填充使用Stream.collect()的集合,並且使用Stream.forEach()做同樣的,具有以下兩個片段:Stream.forEach()是否總是平行工作?
Set<String> uniqueStrings = strings.stream()
.collect(HashSet::new,
HashSet::add,
HashSet::addAll);
而且,
Set<String> set = new HashSet<>();
strings.stream().forEach(s -> set.add(s));
然後他解釋說:
關鍵 區別在於,用forEach()版本,多個線程試圖訪問單個結果 容器同時,而與parallel collect(),每個線程有它自己的本地結果 容器,其結果合併後。
據我的理解,只有在流並行時,多個線程纔會在forEach()情況下工作。但是,在給出的示例中,forEach()在順序流上操作(不調用parallelStream())。
那麼,forEach()是否總是並行工作,或者代碼片段應該調用parallelStream()而不是stream()。 (或者我錯過了什麼?)
順便說一句,在這個例子中,collect()並沒有在並行流上被調用。 (?) – ARX