2 回答

TA貢獻1816條經驗 獲得超6個贊
這些是您必須滿足的條件,以便您可以執行并發縮減,如關于并行的Java 文檔中所述:
如果對于包含收集操作的特定管道滿足以下所有條件,則 Java 運行時會執行并發減少:
流是并行的。
收集操作的參數收集器具有特征 Collector.Characteristics.CONCURRENT。要確定收集器的特征,請調用 Collector.characteristics 方法。
流是無序的,或者收集器具有特征 Collector.Characteristics.UNORDERED。要確保流是無序的,請調用 BaseStream.unordered 操作。
但是,正如@Jigar Joshi 所提到的,它是否會加快您的地圖構建將取決于其他方面,包括(但不僅限于):
您必須處理多少個元素
您的應用程序已經使用了多少線程
有時使用并行性(創建和停止線程,使它們通信和同步,...)的開銷大于收益。

TA貢獻1712條經驗 獲得超3個贊
如果您只是想知道如何更好地利用并行性,您可以執行以下操作:
ConcurrentMap<Integer, List<Integer>> map = IntStream.range(0, Integer.MAX_VALUE)
.parallel()
.filter(i -> i % 2 == 0)
.boxed()
.collect(Collectors.groupingByConcurrent(
i -> i / 3,
Collectors.mapping(i -> i, Collectors.toList())));
Pairs 的中間創建是不必要的,groupingByConcurrent并行累積到新的 ConcurrentMap 中。
請記住,使用并行流時,您會遇到常見的ForkJoinPool. 對于并行化,最好使用更靈活的東西,例如 anExecutorService而不是 Java Streams。
添加回答
舉報