首頁 > Java > java教程 > 主體

如何使用 Java 8 流按多個欄位對資料進行分組?

DDD
發布: 2024-11-26 11:13:09
原創
849 人瀏覽過

How Can I Group Data by Multiple Fields Using Java 8 Streams?

Java 8 中按多個欄位分組

按欄位名稱將物件分組時,Java 8 提供了Collectors.groupingBy()方法。但是,如果我們需要按多個欄位進行分組怎麼辦?

選項1:連結收集器

一種方法是連結多個Collectors.groupingBy() 呼叫:

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

這將會建立一個嵌套地圖,其中第一級按名稱分組,第二級按年齡分組。要擷取名為Fred 的18 歲人員清單:

map.get("Fred").get(18);
登入後複製

選項2:定義分組記錄

或者,我們可以建立一個類別(例如,NameAge)表示分組欄位:

class NameAge implements Comparable<NameAge> {
    String name;
    int age;
    
    // Constructor, getters, compareTo, etc.
}
登入後複製

然後,按NameAge記錄分組:

Map<NameAge, List<Person>> map = people
                .collect(Collectors.groupingBy(Person::getNameAge));
登入後複製

檢索:

map.get(new NameAge("Fred", 18));
登入後複製

選項3:使用Pair 類別

如果實現自訂分組記錄是不可取的,我們可以利用Apache Commons 或Java 的新java.util.function.Pair 等函式庫中的pair類別。例如,使用 Apache Commons:

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

檢索:

map.get(Pair.of("Fred", 18));
登入後複製

建議

方法的選擇取決於特定要求。 Records 提供了簡潔明了的解決方案,但對於更複雜的場景,像 Apache Commons 這樣的庫可能是首選。

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板