Поток GroupingBy на один объект в другой объект

у меня есть три объекта, как показано ниже :

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

Я List<A> С B'объект в каждый A и Cобъект в каждом B.

Я хочу сгруппировать список по C. id на карте Map<C,List<A>>

как я могу достичь этого с помощью groupingBy метод Stream?

1 ответов


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

edit:

так как вы хотите Map<C, List<A>> в качестве типа приемника результирующего набора вам нужно будет переопределить equals и hashcode в своем 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;
}

теперь, вы можете сделать:

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

это означает, что все A объекты, которые имеют то же самое C.id будет в том же ведре (i.e group).