java8流:收集器返回过滤对象

2ledvvac  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(384)

假设我有一套,我想过滤到每所学校最老的。
到目前为止,我已经:

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);
}

我得到所有的人,我不一定需要一张Map。

epggiuax

epggiuax1#

设置,我想过滤到每个学校最老的。
假设每所学校的“最年长”意味着“最年长” Personschool ,您可能正在查找如下输出:

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)
}
gblwokeq

gblwokeq2#

您可以通过中间分组来实现这一点,然后只在 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>

相关问题