Java 8 Streams: сборщик, возвращающий отфильтрованный объект - PullRequest
0 голосов
/ 04 февраля 2019

Скажем, у меня есть набор, который я бы хотел отфильтровать до самого старого в каждой школе.

Пока у меня есть:

Map<String, Long> getOldestPerSchool(Set<Person> persons) {
  return persons.stream().collect(Collectors.toMap(Person::getSchoolname, Person::getAge, Long::max);
}

Проблема в том, что я хочу, чтобы весь человеквместо только имени.Но если я изменю его на:

Map<Person, Long> getOldestPerSchool(Set<Person> persons) {
  return persons.stream().collect(Collectors.toMap(p -> p, Person::getAge, Long::max);
}

, я получу всех людей, и мне не обязательно будет нужна карта.

Ответы [ 2 ]

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

Вы можете достичь этого с помощью промежуточной группировки, а затем только потоковой передачи по values() полученного сгруппированного списка, там вы просто выбираете самого старого человека

Set<Person> oldestPerSchool = persons.stream()             // Stream<Person>
    .collect(Collectors.groupingBy(Person::getSchoolname)) // Map<String, List<Person>>
    .values().stream()                                     // Stream<List<Person>>
    .map(list -> list.stream()                             // (Inner) Stream<Person>
        .max(Comparator.comparingInt(Person::getAge))      // (Inner) Optional<Person>
        .get()                                             // (Inner) Person
    )                                                      // Stream<Person>
    .collect(Collectors.toSet());                          // Set<Person>
0 голосов
/ 04 февраля 2019

Установите, что я хотел бы отфильтровать по самым старым в школе.

Предполагается, что самый старый в школе означает самый старый Person в school,вы, возможно, ищете вывод, как:

Map<String, Person> getOldestPersonPerSchool(Set<Person> persons) {
    return persons.stream()
            .collect(Collectors.toMap(
                    Person::getSchoolname,  // school name
                    Function.identity(), // person
                    (a, b) -> a.getAge() > b.getAge() ? a : b)); // ensure to store oldest (no tie breaker for same age)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...