首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >流groupingBy子类型

流groupingBy子类型
EN

Stack Overflow用户
提问于 2020-06-09 04:15:01
回答 2查看 116关注 0票数 3

我有两个实体:

代码语言:javascript
复制
class Parent {
    Integer id;
    List<Child> children;
}

class Child {

    Integer id;
    Parent parent;
}

在我的DB查询中,我获取了一个Parents列表。现在,我想按子I对此列表进行分组,即

代码语言:javascript
复制
Map<Integer, List<Parent>> myMap;

使用Java8的分组方式我该怎么做?

现在我使用的是resultList.stream().collect(groupingBy(Parent::getChildren)),但这会创建Map<Set<Child>, List<Parent>>,这并不是我想要的。

EN

回答 2

Stack Overflow用户

发布于 2020-06-09 04:25:37

也许你会发现flatMap在这里很有用:

代码语言:javascript
复制
Map<Integer, List<Parent>> childMap = 
    resultList.stream()
              .flatMap(Parent::getChildren)
              .collect(groupingBy(Child::getId, Collectors.mapping(Child::getParent,                                        
                                                    Collectors.toList())));
票数 2
EN

Stack Overflow用户

发布于 2020-06-09 04:25:45

使用flatMap获取子项。然后为子id和父id创建映射条目。然后按子id分组映射条目列表,并将映射条目组值收集为列表。

代码语言:javascript
复制
Map<Integer, List<Parent>> myMap = 
      resultList
        .stream()
        .flatMap(e -> e.getChildren().stream()
                       .map(a -> new SimpleEntry<Integer,Parent>(a.getId(), e)))
        .collect(Collectors.groupingBy(Map.Entry::getKey,
                                       Collectors.mapping(Map.Entry::getValue,
                                                          Collectors.toList())));

或者更简单地使用Child的构造函数

代码语言:javascript
复制
Map<Integer, List<Parent>> myMap = 
      resultList
        .stream()
        .flatMap(e -> e.getChildren().stream()
                       .map(a -> new Child(a.getId(), e)))
        .collect(Collectors.groupingBy(Child::getId, Collectors.mapping(Child::getParent,
                                                          Collectors.toList())));

如果每个家长的每个孩子都有可用的家长数据,那么@cs95解决方案更好。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62270496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档