我有一份关系清单。每个关系对象都有三个变量: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。
提前致谢
最佳答案
您可以尝试将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;
}