当前位置:首页 > Java > 正文

掌握Java分组流(Java Stream API中的Collectors.groupingBy详解)

在现代Java开发中,Java分组流是处理集合数据的强大工具。通过Java 8引入的Stream API,我们可以以声明式的方式对数据进行过滤、映射、排序和分组等操作。本文将手把手教你如何使用Collectors.groupingBy方法实现高效的数据分组,即使是编程新手也能轻松上手!

掌握Java分组流(Java Stream API中的Collectors.groupingBy详解) Java分组流 API分组 Java Collectors.groupingBy Java流式处理 第1张

什么是Java分组流?

Java流式处理(Stream Processing)允许你以管道方式处理数据序列。而分组就是将一个流中的元素根据某个条件划分为多个子集。例如,将学生列表按年级分组,或将订单按客户ID分组。

在Java中,我们使用Collectors.groupingBy这个收集器(Collector)来完成分组操作。它是java.util.stream.Collectors类中的一个静态方法。

基础语法

最简单的分组形式如下:

Map<K, List<T>> result = list.stream()    .collect(Collectors.groupingBy(element -> element.getKey()));  

其中:

  • K 是分组的键类型(如 String、Integer 等)
  • T 是原始列表中元素的类型
  • element -> element.getKey() 是一个函数,用于从每个元素中提取分组依据

实战示例:按部门分组员工

假设我们有一个Employee类:

public class Employee {    private String name;    private String department;    private int salary;    // 构造函数、getter 和 setter 省略    public Employee(String name, String department, int salary) {        this.name = name;        this.department = department;        this.salary = salary;    }    public String getDepartment() { return department; }    public String getName() { return name; }    public int getSalary() { return salary; }}  

现在我们有一组员工数据,想按部门分组:

List<Employee> employees = Arrays.asList(    new Employee("张三", "研发部", 15000),    new Employee("李四", "销售部", 12000),    new Employee("王五", "研发部", 18000),    new Employee("赵六", "人事部", 10000));// 使用 groupingBy 按部门分组Map<String, List<Employee>> groupedByDept = employees.stream()    .collect(Collectors.groupingBy(Employee::getDepartment));// 输出结果groupedByDept.forEach((dept, empList) -> {    System.out.println(dept + ":");    empList.forEach(emp -> System.out.println("  - " + emp.getName()));});  

运行结果:

研发部:  - 张三  - 王五销售部:  - 李四人事部:  - 赵六  

高级用法:多级分组与自定义值类型

除了基本分组,groupingBy还支持:

  1. 二级分组:先按部门分,再按薪资等级分
  2. 改变值类型:不返回List,而是返回Set、计数、平均值等

例如,统计每个部门的人数:

Map<String, Long> deptCount = employees.stream()    .collect(Collectors.groupingBy(        Employee::getDepartment,        Collectors.counting()    ));  

或者,按部门分组后,只保留员工姓名(而不是整个对象):

Map<String, List<String>> deptNames = employees.stream()    .collect(Collectors.groupingBy(        Employee::getDepartment,        Collectors.mapping(Employee::getName, Collectors.toList())    ));  

总结

通过本文,你已经掌握了Java Collectors.groupingBy的核心用法。无论是简单的数据分类,还是复杂的多级聚合分析,Stream API分组都能让你的代码更简洁、更易读。

记住关键点:

  • 分组结果是一个Map
  • 键由分类函数决定
  • 值默认是List,但可通过下游收集器自定义

赶快在你的项目中尝试这些技巧吧!如果你觉得这篇关于Java分组流的教程有帮助,欢迎分享给更多开发者!