【问题标题】:Stream GroupingBy for an Object Inside another Different Object另一个不同对象内的对象的流分组依据
【发布时间】:2018-03-11 13:30:36
【问题描述】:

我有以下三个对象:

public class A {
     private int a;
     private ...
     private B b;
    //getters setters for B
}

public class B {
     private String name;
     private ... 
     private C c;
    //getters setters for C
}

public class C {
     private Long id;
     private ... 
}

我在每个AC 的每个B 中都有一个List<A>B's 对象。

我想在地图Map<C,List<A>> 中按 C.id 对列表进行分组

如何使用StreamgroupingBy 方法实现这一点?

【问题讨论】:

    标签: lambda java-8 java-stream


    【解决方案1】:
    Map<Long, List<A>> resultSet = 
           myList.stream()
                 .collect(Collectors.groupingBy(e -> e.getB().getC().getId()));
    

    编辑:

    由于您希望 Map&lt;C, List&lt;A&gt;&gt; 作为结果集的接收器类型,因此您需要在 C 类中覆盖 equalshashcode,如下所示:

    class C {
         public Long getId() {
             return id;
         }
    
         @Override
         public boolean equals(Object o) {
             if (this == o) return true;
             if (o == null || getClass() != o.getClass()) return false;
    
             C c = (C) o;
    
             return id != null ? id.equals(c.id) : c.id == null;
         }
    
         @Override
         public int hashCode() {
             return id != null ? id.hashCode() : 0;
         }
    
         private Long id;
    }
    

    现在,你可以这样做了:

    Map<C,List<A>> resultSet = 
         myList.stream()
               .collect(Collectors.groupingBy(e -> e.getB().getC()));
    

    这意味着具有相同C.id 的所有A 对象将位于同一个存储桶(即组)中。

    【讨论】:

    • 我做了一个编辑,我实际上需要地图中的 C 对象而不是 Id,它的 Map> 而不是 Map> 但我想分组通过 C.id
    • @iamP 我想在地图 Map> 中按 C.id 对列表进行分组,如果你按 C.id 分组,那么你不能有Map&lt;C,List&lt;A&gt;&gt;。你想按C分组吗?您可以在C 中覆盖equalshashcode,然后按C 分组。
    • 我可以按 C 分组,但我不确定具有相同 C.id 的对象是否相等
    猜你喜欢
    • 2021-10-22
    • 2019-07-29
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 2020-08-15
    • 2022-11-21
    • 2018-10-04
    相关资源
    最近更新 更多