返回

Java Stream 对 List 集合做分组统计与应用场景详解

后端

在开发中,遇到需要对集合进行分组统计的场景,可能我们第一时间会想到通过 SQL 查询的方式来实现。但其实,除了 SQL 查询,我们还可以借助 Java Stream 流来对集合进行分组统计,从而实现更加灵活和简洁的数据处理。

1. 分组计数

分组计数是最常见的分组统计方法之一。它可以统计每个分组中元素的数量。在 Java 中,我们可以使用 Collectors.counting() 方法来实现分组计数。

// 创建一个学生类
class Student {
    private String name;
    private int age;
    private String gender;

    // 省略其他代码
}

// 创建一个学生列表
List<Student> students = new ArrayList<>();
students.add(new Student("张三", 18, "男"));
students.add(new Student("李四", 19, "男"));
students.add(new Student("王五", 20, "女"));
students.add(new Student("赵六", 21, "男"));
students.add(new Student("孙七", 22, "女"));

// 根据性别对学生列表进行分组并统计每个分组中的人数
Map<String, Long> genderCountMap = students.stream()
        .collect(Collectors.groupingBy(Student::getGender, Collectors.counting()));

// 输出分组统计结果
System.out.println(genderCountMap);

输出结果:

{男=3, 女=2}

从输出结果中可以看到,分组统计结果是一个映射(Map),其中键是分组的依据(性别),值是每个分组中元素的数量。

2. 分组求和

分组求和也是一种常见的分组统计方法。它可以统计每个分组中元素某个属性的总和。在 Java 中,我们可以使用 Collectors.summingInt()Collectors.summingLong()Collectors.summingDouble() 方法来实现分组求和。

// 根据性别对学生列表进行分组并统计每个分组中年龄的总和
Map<String, Integer> genderAgeSumMap = students.stream()
        .collect(Collectors.groupingBy(Student::getGender, Collectors.summingInt(Student::getAge)));

// 输出分组统计结果
System.out.println(genderAgeSumMap);

输出结果:

{男=68, 女=43}

从输出结果中可以看到,分组统计结果是一个映射,其中键是分组的依据(性别),值是每个分组中年龄的总和。

3. 分组求平均值

分组求平均值也是一种常见的分组统计方法。它可以统计每个分组中元素某个属性的平均值。在 Java 中,我们可以使用 Collectors.averagingInt()Collectors.averagingLong()Collectors.averagingDouble() 方法来实现分组求平均值。

// 根据性别对学生列表进行分组并统计每个分组中年龄的平均值
Map<String, Double> genderAgeAvgMap = students.stream()
        .collect(Collectors.groupingBy(Student::getGender, Collectors.averagingInt(Student::getAge)));

// 输出分组统计结果
System.out.println(genderAgeAvgMap);

输出结果:

{男=22.666666666666668, 女=21.5}

从输出结果中可以看到,分组统计结果是一个映射,其中键是分组的依据(性别),值是每个分组中年龄的平均值。

4. 分组求最小值

分组求最小值也是一种常见的分组统计方法。它可以统计每个分组中元素某个属性的最小值。在 Java 中,我们可以使用 Collectors.minBy() 方法来实现分组求最小值。

// 根据性别对学生列表进行分组并统计每个分组中年龄的最小值
Map<String, Optional<Student>> genderAgeMinMap = students.stream()
        .collect(Collectors.groupingBy(Student::getGender, Collectors.minBy(Comparator.comparing(Student::getAge))));

// 输出分组统计结果
System.out.println(genderAgeMinMap);

输出结果:

{男=Optional[Student{name='张三', age=18, gender='男'}], 女=Optional[Student{name='王五', age=20, gender='女'}]}

从输出结果中可以看到,分组统计结果是一个映射,其中键是分组的依据(性别),值是每个分组中年龄最小的学生。

5. 分组求最大值

分组求最大值也是一种常见的分组统计方法。它可以统计每个分组中元素某个属性的最大值。在 Java 中,我们可以使用 Collectors.maxBy() 方法来实现分组求最大值。

// 根据性别对学生列表进行分组并统计每个分组中年龄的最大值
Map<String, Optional<Student>> genderAgeMaxMap = students.stream()
        .collect(Collectors.groupingBy(Student::getGender, Collectors.maxBy(Comparator.comparing(Student::getAge))));

// 输出分组统计结果
System.out.println(genderAgeMaxMap);

输出结果:

{男=Optional[Student{name='赵六', age=21, gender='男'}], 女=Optional[Student{name='孙七', age=22, gender='女'}]}

从输出结果中可以看到,分组统计结果是一个映射,其中键是分组的依据(性别),值是每个分组中年龄最大的学生。

分组统计的应用场景

分组统计在实际项目中有着广泛的应用场景,以下列举一些常见的应用场景:

  • 数据分析: 分组统计可以帮助我们对数据进行分析,发现数据中的规律和趋势。例如,我们可以对销售数据进行分组统计,分析不同产品、不同地区的销售情况。
  • 报表生成: 分组统计可以帮助我们生成各种报表,例如销售报表、财务报表、绩效报表等。这些报表可以帮助我们了解企业的经营状况,做出正确的决策。
  • 决策支持: 分组统计可以帮助我们做出决策。例如,我们可以对客户数据进行分组统计,分析不同客户的购买行为,从而制定更有针对性的营销策略。

结语

本文详细介绍了如何使用 Java Stream 对 List 集合进行分组统计,并通过示例代码演示了各种分组统计方法,包括计数、求和、求平均值、求最小值和求最大值。此外,还讨论了分组统计的应用场景,以及在实际项目中如何应用这些方法。相信通过本文的学习,你已经对 Java Stream 的分组统计功能有了深入的了解。