Поток Java: группировать по полю и выбрать другой в качестве ключа группировки - PullRequest
0 голосов
/ 19 февраля 2019

Я бы хотел сгруппировать по полю a select

Угадайте этот класс:

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() в качестве объекта группировкиkey.

Collection<Person> persons = new ...

Map<Name, List<Person>> group = persons.stream()
  .collect(groupingby(p -> p.getName().getMotherName());

Как видите, я бы хотел получить Map<Name, List<Person>> вместо Map<String, List<Person>>

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Поскольку вы не можете переопределить equals(), я могу думать о следующем:

Создайте обертку вокруг Name, которая переопределяет equals() и hashCode() для 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());
    }
}

Затем вы можете сопоставить Person#getName() с NameWrapper и сгруппировать по этому:

Map<NameWrapper, List<Person>> group = persons.stream()
    .collect(Collectors.groupingBy(p -> new NameWrapper(p.getName())));
0 голосов
/ 19 февраля 2019

Вы можете использовать:

Map<Name, List<Person>> group = persons.stream()
        .collect(Collectors.groupingBy(p -> p.getName()));

И вам нужно переопределить hashCode и сравнить его с вашим классом Name.

@Override
public boolean equals(Object o) {
    // your equals code
}

@Override
public int hashCode() {
    // your hash code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...