为了账号安全,请及时绑定邮箱和手机立即绑定

Java 8 Streams:收集器返回过滤后的对象

Java 8 Streams:收集器返回过滤后的对象

潇潇雨雨 2022-06-04 15:23:36
假设我有一个集合,我想过滤到每所学校最古老的集合。到目前为止,我有: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 回答

?
萧十郎

TA贡献1815条经验 获得超13个赞

设置我想过滤到每所学校最老的。


假设最老的每所学校意味着最老Person的 perschool,您可能正在寻找如下输出:


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)

}


查看完整回答
反对 回复 2022-06-04
?
暮色呼如

TA贡献1853条经验 获得超9个赞

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


查看完整回答
反对 回复 2022-06-04
  • 2 回答
  • 0 关注
  • 504 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信