我有三个对象如下:
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
个对象。
我想在地图Map<C,List<A>>
如何使用groupingBy
的{{1}}方法实现此目的?
答案 0 :(得分:8)
Map<Long, List<A>> resultSet =
myList.stream()
.collect(Collectors.groupingBy(e -> e.getB().getC().getId()));
修改强>
由于您希望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
个对象将位于同一个存储桶中(即组)。