一、基礎概念
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
微信掃一掃
支付寶掃一掃