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中文網其他相關文章!