一、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/n/257196.html