一、GroupingBy的介紹
GroupingBy是Java 8中的一種重要的函數式編程工具,它可以將對象流按照指定的規則分組,生成一個Map類型的集合。在Java 8 Stream API中,它起到了舉足輕重的作用。GroupingBy可以說是Stream API的集大成者,它不僅可以將流按照任意規則分組,還可以對各個分組內的元素進行一些處理操作。
二、GroupingBy的語法
Map<K,List> groupingBy(Functionclassifier) Map groupingBy(Functionclassifier,Collectordownstream)
其中,第一個參數是分組規則,可以是謂詞、Lambda表達式或自定義的Function。第二個參數是對分組結果進一步處理的Collector,比如計數、求和、平均值、最大值、最小值等。
三、GroupingBy的應用場景
GroupingBy通常應用於需要對一些數據進行分類、統計、分組等操作的場景。
四、GroupingBy的實例演示
小標題1:按照屬性分組
我們可以使用GroupingBy將一個Stream按照某個屬性進行分組,得到一個Map對象。
//創建一個Person類 public class Person { private String name; private int age; private String gender; private String city; //省略構造方法和getter方法 } //創建一個Person對象集合 List persons = Arrays.asList( new Person("Jane", 20, "female", "Shanghai"), new Person("John", 25, "male", "Beijing"), new Person("Tom", 30, "male", "Shenzhen"), new Person("Lucy", 27, "female", "Guangzhou"), new Person("Tina", 22, "female", "Beijing") ); //按照性別分組 Map<String, List> genderMap = persons.stream().collect(Collectors.groupingBy(Person::getGender));
上述代碼中,我們按照性別對Person對象進行了分組,得到了一個Map<String, List<Person>>類型的genderMap集合。其中,鍵為字符串類型,表示性別;值為Person對象的List類型,表示分組後的結果。
小標題2:按照指定條件進行分組
GroupingBy也支持根據指定的條件進行分組,可以通過Lambda表達式實現。
//按照年齡分組,小於25歲的為一組,25歲以上的為一組 Map<Boolean, List> ageMap = persons.stream().collect(Collectors.groupingBy(p -> p.getAge() < 25));
上面代碼中,我們按照年齡將Person對象分為兩組,年齡小於25歲的為一組,年齡大於等於25歲的為另一組。
小標題3:分組後統計
GroupingBy不僅可以將對象流分組,還可以對組內的元素進行統計操作。
//統計每個城市的人口數量 Map cityPopulationMap = persons.stream().collect(Collectors.groupingBy(Person::getCity, Collectors.counting()));
上述代碼中,我們按照城市進行分組,並統計每個城市的人口數量,得到了一個Map<String, Long>類型的城市-人口數量集合。
小標題4:一次分組多個屬性
GroupingBy還支持一次按照多個屬性進行分組。
//按照城市和性別分組,並統計每個城市各性別的人口數量 Map<String, Map> cityGenderMap = persons.stream().collect(Collectors.groupingBy(Person::getCity, Collectors.groupingBy(Person::getGender, Collectors.counting())));
上述代碼中,我們按照城市和性別進行分組,並統計了每個城市各性別的人口數量,得到了一個Map<String, Map<String, Long>>類型的城市-性別-人口數量集合。其中,外層的Map表示按照城市分組,內層的Map表示按照性別分組,Long類型的值表示每個組內的數量。
小標題5:按照函數自定義分組
GroupingBy還支持根據自定義函數進行分組。
//根據姓名的首字母進行分組 Map<Character, List> nameInitialMap = persons.stream() .collect(Collectors.groupingBy(p -> p.getName().charAt(0)));
上述代碼中,我們按照姓名的首字母進行分組,得到了一個Map<Character, List<Person>>類型的姓名首字母-人員集合。
總結
Java8 GroupingBy是一個非常實用的函數式編程工具,它可以幫助我們對一些數據進行分組、統計、分類等操作,極大地提高了程序的開發效率。在使用GroupingBy時,需要注意規則的選擇、函數的定義以及Collector的應用等問題。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/257196.html