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