为了账号安全,请及时绑定邮箱和手机立即绑定

使用流 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 关注
  • 83 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信