说我有,我想下来过滤到每所学校最古老的一集。
到目前为止,我有:
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);
}
我得到的所有的人,我并不一定需要一张地图。
集,我想下来过滤到每所学校最古老的。
假设每所学校最古老意味着每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)
}
你可以用一个中间分组实现这一目标,然后只流过所产生的分组列表的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>