爪哇8流:集电极归国过滤的对象

问题描述 投票:2回答:2

说我有,我想下来过滤到每所学校最古老的一集。

到目前为止,我有:

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

我得到的所有的人,我并不一定需要一张地图。

java hashmap java-stream
2个回答
3
投票

集,我想下来过滤到每所学校最古老的。

假设每所学校最古老意味着每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)
}

0
投票

你可以用一个中间分组实现这一目标,然后只流过所产生的分组列表的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>
© www.soinside.com 2019 - 2024. All rights reserved.