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

Java 8 lambdas 将列表分组到映射中 - 如果每个键有多个列表项,则不同的键

Java 8 lambdas 将列表分组到映射中 - 如果每个键有多个列表项,则不同的键

手掌心 2022-12-28 16:23:56
我有一个关系列表。每个关系对象都有三个变量:personA、personB 和 relationshipType。relationshipType 对象有两个变量:relationship (Son) 和 relationshipPlural (Sons)我有一个要求,我需要列出一个人的关系。如果一个人只有一个妻子,那就是:Wife      <wifeName>如果这个人有一个以上的儿子,那就是:    Sons      <firstSonName>               <secondSonName>是否有一个简单的 lambda 表达式,我可以在其中将关系列表转换为map<String,List<relationship>>where 如果键具有包含多个项目的列表,则键值是 relationshipType.relationshipPlural 值?我能想到的唯一选择是使用两个表达式,1)Collectors.toMap()创建一个关系类型的地图,然后2) 处理地图以创建另一个地图,如果地图的值是具有多个值的列表,则地图的键将为 relationshipType.relationshipPlural。
查看完整描述

1 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

您可以尝试使用collectingAndThenwith groupingByas downstream as :


private Map<String, List<RelationShip>> groupAndMapRelationships(List<RelationShip> relationShips) {

   return relationShips.stream()

           .collect(Collectors.collectingAndThen(

                   Collectors.groupingBy(RelationShip::getRelationshipType),

                   map -> map.entrySet().stream()

                           .map(e -> new AbstractMap.SimpleEntry<>(

                                   e.getValue().size() == 1 ?

                                           e.getKey().getRelationship() : e.getKey().getRelationshipPlural(),

                                   e.getValue()))

                           .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))));

}

我考虑过的最小 POJO 看起来像:


@Getter

class RelationShip {

    String personA;

    String personB;

    RelationshipType relationshipType;

}


@Getter

class RelationshipType {

    String relationship;

    String relationshipPlural;

}


查看完整回答
反对 回复 2022-12-28
  • 1 回答
  • 0 关注
  • 69 浏览

添加回答

举报

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