Java 8 Lambdas组列表映射到地图-如果每个键有多个列表项,则为不同的键

时间:2019-06-03 15:17:14

标签: java java-8 java-stream

我有一个关系列表。每个关系对象都有三个变量:personA,personB和RelationshipType。

RelationshipType对象具有两个变量:Relationship(Son)和RelationshipPlural(Sons)

我有一个需要列出一个人的关系的要求。如果一个人有一个妻子,那就是:

Wife      <wifeName>

如果该人有多个儿子,那就是:

    Sons      <firstSonName>
              <secondSonName>

是否有一个简单的lambda表达式,我可以将关系列表转换为map<String,List<relationship>>,如果键的列表中包含多个项目,那么键值就是RelationshipType.relationshipPlural值?

我唯一想到的选择是使用两个表达式

1)Collectors.toMap()创建一个RelationshipType映射,然后

2)处理地图以创建另一个地图,如果地图的值是一个包含多个值的列表,则该地图的键将为RelationshipType.relationshipPlural。

预先感谢

1 个答案:

答案 0 :(得分:2)

您可以尝试将collectingAndThen作为下游的groupingBy使用:

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;
}