亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 555 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號