首頁  >  文章  >  Java  >  如何使用「Collectors.groupingBy()」在 Java 8 中按多個欄位進行分組?

如何使用「Collectors.groupingBy()」在 Java 8 中按多個欄位進行分組?

Susan Sarandon
Susan Sarandon原創
2024-11-24 16:28:12949瀏覽

How to Group by Multiple Fields in Java 8 Using `Collectors.groupingBy()`?

Java 8 中以多個欄位分組

在Java 8 中,Collectors.groupingBy() 方法通常用於根據一個特定的領域。但是,如果您需要按同一 POJO 中的多個欄位進行分組怎麼辦?

有多種可用選項:

連結收集器

Map<String, Map<Integer, List<Person>>> map = people
    .collect(Collectors.groupingBy(Person::getName,
        Collectors.groupingBy(Person::getAge));

此程式碼先按名稱然後按年齡對 Person物件進行分組,從而產生巢狀映射

定義分組類別

class Person {
    record NameAge(String name, int age) { }

    public NameAge getNameAge() {
        return new NameAge(name, age);
    }
}

Map<NameAge, List<Person>> map = people.collect(Collectors.groupingBy(Person::getNameAge));

透過建立封裝分組條件(例如NameAge)的記錄或類,您可以直接按分組所需欄位。

使用一對類別

import org.apache.commons.lang3.tuple.Pair;

Map<Pair<String, Integer>, List<Person>> map = people
    .collect(Collectors.groupingBy(p -> Pair.of(p.getName(), p.getAge())));

如果您使用的是第三方函式庫,您可以利用其pair類別來表示分組標準。

選擇最佳選項

方法的選擇取決於您的特定要求項目:

  • 如果您需要一個簡單直接的方法來按多個欄位進行分組,連結收集器是一個實用的解決方案。
  • 如果您喜歡更封裝的方法來實現分組意圖顯式地,建議定義分組類別或使用pair類別。
  • Java版本> = 16中記錄的可用性簡化了建立分組類,使其成為清晰度和可維護性的首選。

以上是如何使用「Collectors.groupingBy()」在 Java 8 中按多個欄位進行分組?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn