一、基礎概念
Java 8的Stream API提供了豐富的中間操作,其中collect方法可以將流轉化為另一種數據結構。collect方法接受一個Collector類型的參數,Collector
是一個很重要的類,它定義了將流轉化為集合或Map的方法。
Collectors.groupingBy()
是Collector
類中的一個靜態方法,它接受一個分類函數和一個可選的結果轉換函數,返回一個將輸入元素分組的Map。
二、使用groupingBy方法分類
使用groupingBy
方法可以把一組元素分為多個組。下面使用一個簡單的例子演示:
List<Person> people = Arrays.asList( new Person("Alice", 20), new Person("Bob", 35), new Person("Charlie", 50), new Person("David", 20), new Person("Eric", 35), new Person("Frank", 50) ); Map<Integer, List<Person>> peopleByAge = people.stream().collect(Collectors.groupingBy(Person::getAge));
其中Person類定義如下:
class Person { private final String name; private final int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } public String toString() { return name + " (" + age + ")"; } }
運行結果:
{50=[Charlie (50), Frank (50)], 35=[Bob (35), Eric (35)], 20=[Alice (20), David (20)]}
這裡使用Person類的getAge()
方法,將Person對象按照年齡分為三組,並且以年齡作為Map的Key。
三、使用groupingBy方法進一步分類
groupingBy
方法還可以進一步分類,例如將年齡相同的人按照名字字母順序排序。
Map<Integer, List<Person>> peopleByAge = people.stream().collect(Collectors.groupingBy(Person::getAge, TreeMap::new, Collectors.toList())); Map<Integer, Map<String, List<Person>>> peopleByAgeAndName = people.stream() .collect(Collectors.groupingBy(Person::getAge, TreeMap::new, Collectors.groupingBy(p -> p.getName().substring(0, 1), TreeMap::new, Collectors.toList())));
這裡將輸入元素Person分成了兩個層次,第一層是年齡,第二層是以名字首字母開頭的字母表順序。這裡使用了一個額外的TreeMap
來存儲分組的結果,以保證結果的順序。運行結果如下:
{ 20={ A=[Alice (20)], D=[David (20)] }, 35={ B=[Bob (35)], E=[Eric (35)] }, 50={ C=[Charlie (50)], F=[Frank (50)] } }
四、使用groupingBy方法對元素進行統計
groupingBy
方法還可以結合另一個方法Collectors.counting()
,將每個分組中的元素統計出個數。下面使用一個例子說明:
Map<Integer, Long> peopleCountByAge = people.stream().collect(Collectors.groupingBy(Person::getAge, Collectors.counting()));
這裡將Person對象按照年齡分組,並且使用counting()
方法對每個分組中的元素進行統計,最終得到一個以年齡為Key,以該年齡對應的Person對象數量為Value的Map。運行結果如下:
{20=2, 35=2, 50=2}
五、結語
本文深入介紹了使用Collectors.groupingBy()
方法對流元素進行分類和統計。可以看出,在Java 8的Stream API中,collect方法和Collector類是非常重要的組成部分,尤其是在處理大數據時,使用Stream和Collector可以幫助我們更加方便和高效地進行數據處理。
原創文章,作者:WLJT,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/136455.html