Поток 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).