流分组用于另一个不同对象内的对象

iam*_*amP 6 lambda java-8 java-stream

我有三个对象如下:

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 ... 
}
Run Code Online (Sandbox Code Playgroud)

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

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

我如何使用这种groupingBy方法实现这一目标Stream

Ous*_* D. 8

Map<Long, List<A>> resultSet = 
       myList.stream()
             .collect(Collectors.groupingBy(e -> e.getB().getC().getId()));
Run Code Online (Sandbox Code Playgroud)

编辑:

既然你想要一个Map<C, List<A>>作为结果集的接收器类型,那么你需要覆盖equalshashcode在你的C类中这样:

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;
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以:

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

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

  • 好!我想你不能比这更简单 (5认同)