首页 > 解决方案 > 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>>

有任何想法吗?

标签: javajava-stream

解决方案


由于您无法覆盖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())));

推荐阅读