亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java 并行流生成 HashMap

Java 并行流生成 HashMap

慕碼人8056858 2021-09-15 11:01:28
我有以下測試,測試范圍從 0 到最大值的整數,如果驗證通過,則構建對 (vals[i], i)。最后,我想生成一個 HashMap,它使用 vals[i] 作為鍵,值是整數列表。代碼看起來像,IntStream.range(0, max)   .parallel()   .filter(i-> sometest(i))   .mapToObj(i -> new Pair<>(vals[i],i))   .collect(groupingBy(Pair::getFirst, mapping(Pair::getSecond, toList())));我的問題是,是否可以使用并行流來加速該地圖的構建?
查看完整描述

2 回答

?
瀟湘沐

TA貢獻1816條經驗 獲得超6個贊

這些是您必須滿足的條件,以便您可以執行并發縮減,如關于并行Java 文檔中所述:

如果對于包含收集操作的特定管道滿足以下所有條件,則 Java 運行時會執行并發減少:

  • 流是并行的。

  • 收集操作的參數收集器具有特征 Collector.Characteristics.CONCURRENT。要確定收集器的特征,請調用 Collector.characteristics 方法。

  • 流是無序的,或者收集器具有特征 Collector.Characteristics.UNORDERED。要確保流是無序的,請調用 BaseStream.unordered 操作。

但是,正如@Jigar Joshi 所提到的,它是否會加快您的地圖構建將取決于其他方面,包括(但不僅限于):

  • 您必須處理多少個元素

  • 您的應用程序已經使用了多少線程

有時使用并行性(創建和停止線程,使它們通信和同步,...)的開銷大于收益。


查看完整回答
反對 回復 2021-09-15
?
交互式愛情

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。


查看完整回答
反對 回復 2021-09-15
  • 2 回答
  • 0 關注
  • 192 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號