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

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

使用流 API 分組時,多個組中的單個元素

使用流 API 分組時,多個組中的單個元素

揚帆大魚 2022-09-28 15:49:44
我正在審查一些舊代碼,我正在對元素進行分組。它看起來或多或少像這樣:Map<Long,List<Items>> groupedItems = ...for (long groupid : groups){    for (Item item :items){        if (isGroupAccepting(item.getId(),groupid) || groupid == item.getGroup()) {            groupedItems.get(groupid).add(item);        }    }}我計劃使用流 API 中的分組來替換它,但是我卡住了。它適用于我的第二個條件,但是如何處理第一個條件,其中項目應該添加到接受該類型的項目的每個組中?這真的有可能,還是我在這里與一個失敗的事業作斗爭?
查看完整描述

2 回答

?
慕哥9229398

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

您可以創建所有有效組 ID 和項的對,然后按組 ID 對它們進行分組:


Map<Long,List<Item>> groupedItems =

    groups.stream()

          .flatMap(g -> items.stream()

                             .filter(i -> isGroupAccepting(i.getId(),g) || g == i.getGroup())

                             .map(i -> new SimpleEnty<>(g,i))

          .collect(Collectors.groupingBy(Map.Entry::getKey,

                   Collectors.mapping(Map.Entry::getValue,

                                      Collectors.toList())));


查看完整回答
反對 回復 2022-09-28
?
慕姐8265434

TA貢獻1813條經驗 獲得超2個贊

如果您使用的是 Idk 9 或更高版本,請嘗試以下操作:Collectors.flatMapping


// import static java.util.stream.Collectors.*;

Map<Long, List<Item>> groupedItems = groups.stream()

    .collect(groupingBy(Function.identity(),

        flatMapping(

            groupId -> items.stream()

                .filter(item -> isGroupAccepting(item.getId(), groupId) || groupId == item.getGroup()),

            toList())));

不確定為什么要嘗試用 lambdas/流 API 替換循環。對我來說,代碼看起來很棒。大多數時候,lambdas 代碼看起來很丑陋,更難理解。forfor


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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