簡體   English   中英

Java 8流:收集器返回過濾的對象

[英]Java 8 Streams: collector returning filtered object

假設我有一個我想過濾到每所學校最古老的組合。

到目前為止,我有:

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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM