【问题标题】:Java 8 lambdas group list into map - different key if more than one list item per keyJava 8 lambdas 将列表分组到映射中 - 如果每个键有多个列表项,则使用不同的键
【发布时间】:2019-06-03 23:42:48
【问题描述】:

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

relationshipType对象有两个变量:relationship(Son)和relationshipPlural(Sons)

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

Wife      <wifeName>

如果此人有多个儿子,则为:

    Sons      <firstSonName>
              <secondSonName>

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

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

1)Collectors.toMap()创建relationshipType的map,然后

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

提前致谢

【问题讨论】:

  • 您可以使用groupBy 按类型对它们进行分组...但是您是说地图的键对于单个和多个关系会有所不同? (这在单个管道中可能无法巧妙地实现)
  • 你好@Naman,谢谢你的评论。是的。如果通过 relationshipType 有多个关系,则使用 relationshipType.relationshipPlural 作为映射键。否则,使用 relationshipType.relationship。谢谢

标签: java java-8 java-stream


【解决方案1】:

您可以尝试使用collectingAndThengroupingBy 作为下游:

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

【讨论】:

  • 谢谢你,@Naman。这是一个非常强大的解决方案。你是怎么弄清楚的?您是如何获得有关流的知识的?是通过书籍/教程/反复试验吗?谢谢
  • @LucasT 更多来自 SO 本身的反复试验。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 2014-07-21
  • 1970-01-01
  • 2019-01-21
  • 1970-01-01
  • 1970-01-01
  • 2020-05-23
相关资源
最近更新 更多