Java8 GroupingBy详解

一、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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-15 12:44
下一篇 2024-12-15 12:44

相关推荐

  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • MPU6050工作原理详解

    一、什么是MPU6050 MPU6050是一种六轴惯性传感器,能够同时测量加速度和角速度。它由三个传感器组成:一个三轴加速度计和一个三轴陀螺仪。这个组合提供了非常精细的姿态解算,其…

    编程 2025-04-25
  • Python安装OS库详解

    一、OS简介 OS库是Python标准库的一部分,它提供了跨平台的操作系统功能,使得Python可以进行文件操作、进程管理、环境变量读取等系统级操作。 OS库中包含了大量的文件和目…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25
  • git config user.name的详解

    一、为什么要使用git config user.name? git是一个非常流行的分布式版本控制系统,很多程序员都会用到它。在使用git commit提交代码时,需要记录commi…

    编程 2025-04-25
  • Java BigDecimal 精度详解

    一、基础概念 Java BigDecimal 是一个用于高精度计算的类。普通的 double 或 float 类型只能精确表示有限的数字,而对于需要高精度计算的场景,BigDeci…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25

发表回复

登录后才能评论