首頁 >Java >java教程 >如何使用「Collectors.groupingBy()」在 Java 8 中按多個欄位對資料進行分組?

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

Patricia Arquette
Patricia Arquette原創
2024-11-24 10:27:11661瀏覽

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

Java 8 中以多個欄位分組,超越單一欄位分組

以單一欄位對物件進行分組是資料處理中的常見操作。但是,可能會出現需要按多個欄位進行分組的情況。提供的初始程式碼片段示範了按年齡欄位進行分組。本文深入探討了以同一 POJO 中的多個欄位進行分組的選項。

連結收集器

一個簡單的方法是連結多個收集器。以下的程式碼示範了這個技巧:

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

透過這個方法,擷取名為Fred 的18 歲個體的清單:

map.get("Fred").get(18);

定義分組記錄

建立一個表示分組的類別是另一種方法。這裡,用一筆記錄來表示姓名和年齡的組合:

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));

在分組資料中搜尋:

map.get(new NameAge("Fred", 18));

使用框架中的Pair 類別庫

像Apache Commons 這樣的函式庫為這種類型的場景提供了pair類別。使用pair類,映射的鍵可以建構為:

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

從映射中檢索:

map.get(Pair.of("Fred", 18));

結論

Java 8 的Collectors.groupingBy() 方法提供了對資料分組的彈性。本文示範了將分組擴展到單一欄位之外的不同方法,包括連結收集器、定義自訂分組記錄以及利用框架庫中的對類。此外,Java 中的記錄可以更輕鬆地定義分組標準,而無需自訂類別。

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

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