java - java流:按字段分组并选择其他作为分组键
问题描述
我想按一个字段分组一个选择
猜猜这个类:
public class Person {
private Name name;
private Address address;
...
}
public class Name {
private String name;
private String fatherName;
private String motherName;
}
我想分组Person.getName().getMotherName()
并选择Person.getName()
作为分组对象键。
Collection<Person> persons = new ...
Map<Name, List<Person>> group = persons.stream()
.collect(groupingby(p -> p.getName().getMotherName());
如您所见,我想获得 a Map<Name, List<Person>>
,而不是 aMap<String, List<Person>>
有任何想法吗?
解决方案
由于您无法覆盖equals()
,我可以这样想:
创建一个包装器,围绕Name
它覆盖equals()
和hashCode()
for Name.getMotherName()
:
public class NameWrapper {
private final Name name;
public NameWrapper(Name name) {
this.name = name;
}
@Override
public int hashcode() {
return name.getMotherName().hashCode();
}
@Override
public boolean equals(Object obj) {
if(obj == this) return true;
if(!(obj instanceof NameWrapper)) return false;
NameWrapper other = (NameWrapper) obj;
return name.getMotherName().equals(other.name.getMotherName());
}
}
然后您可以将 a 映射Person#getName()
到 aNameWrapper
并按以下方式分组:
Map<NameWrapper, List<Person>> group = persons.stream()
.collect(Collectors.groupingBy(p -> new NameWrapper(p.getName())));
推荐阅读
- node.js - mongoose:将类型添加到模式中,这是一种遵循协议的类型
- ios - com.facebook.sdk.core 错误 3 - iOS、Swift
- react-native - 在我的项目中安装 native-base 时出错
- tensorflow - 在 TF 中进行批处理时回溯
- imagemagick - 将图像从一种格式转换为另一种发送到 STDOUT
- javascript - 如何从 CoinGecko api 获取所有 (6867) 图像?
- django-settings - django corsheaders.middleware'没有属性'CorseMiddleware'
- json - 使用 jq 将文本文件作为数组添加到 json 字段
- apache-spark - 如何从数据集中创建不同的行组合
- angular - 在等待下一个值时在组件中渲染可观察?