Java 8 分组之后求和

引言

在开发过程中,我们经常需要对数据进行分组并对每个分组进行求和操作。在 Java 8 中,我们可以使用 Stream API 来轻松地实现这一功能。本文将介绍如何在 Java 8 中使用 Stream API 对数据进行分组并求和,并通过代码示例来说明。

Stream API 简介

Stream API 是 Java 8 中新增的一个功能强大的库,用于处理集合(Collection)数据。它提供了一种声明式的方式来操作数据,可以极大地简化代码,并且支持并行操作,提高了程序的执行效率。

Stream API 提供了一系列的操作,如过滤、映射、排序、归约等,用于对集合数据进行处理。其中,groupingBysummingInt 是我们在本文中要用到的两个操作。

分组和求和示例

假设我们有一个包含员工信息的列表,每个员工有姓名、部门和薪水三个属性。我们希望按照部门对员工进行分组,并计算每个部门的薪水总和。

首先,我们需要定义一个 Employee 类来表示员工信息,如下所示:

public class Employee {
    private String name;
    private String department;
    private int salary;

    public Employee(String name, String department, int salary) {
        this.name = name;
        this.department = department;
        this.salary = salary;
    }

    // Getters and setters

    // toString() method
}

然后,我们创建一个包含多个员工信息的列表:

List<Employee> employeeList = new ArrayList<>();
employeeList.add(new Employee("Alice", "HR", 5000));
employeeList.add(new Employee("Bob", "IT", 6000));
employeeList.add(new Employee("Charlie", "HR", 4000));
employeeList.add(new Employee("David", "IT", 7000));
employeeList.add(new Employee("Eve", "Sales", 5500));
employeeList.add(new Employee("Frank", "Sales", 4500));

接下来,我们可以使用 Stream API 来对员工列表进行分组和求和操作。首先,我们使用 groupingBy 操作按照部门进行分组:

Map<String, List<Employee>> employeeByDepartment = employeeList.stream()
        .collect(Collectors.groupingBy(Employee::getDepartment));

上述代码将会生成一个 Map,其中键为部门名称,值为该部门下的员工列表。接着,我们可以使用 summingInt 操作对每个部门的薪水进行求和:

Map<String, Integer> totalSalaryByDepartment = employeeByDepartment.entrySet().stream()
        .collect(Collectors.toMap(Map.Entry::getKey,
                e -> e.getValue().stream().mapToInt(Employee::getSalary).sum()));

上述代码将会生成一个 Map,其中键为部门名称,值为该部门下的员工薪水总和。最后,我们可以通过输出这个 Map 来查看结果:

totalSalaryByDepartment.forEach((department, totalSalary) ->
        System.out.println(department + ": " + totalSalary));

运行上述代码,输出结果如下:

HR: 9000
IT: 13000
Sales: 10000

类图

下面是 Employee 类的类图表示:

classDiagram
    class Employee {
        - String name
        - String department
        - int salary
        + Employee(name: String, department: String, salary: int)
        + getName(): String
        + setName(name: String): void
        + getDepartment(): String
        + setDepartment(department: String): void
        + getSalary(): int
        + setSalary(salary: int): void
    }

总结

本文介绍了如何在 Java 8 中使用 Stream API 对数据进行分组并求和的方法。通过使用 groupingBysummingInt 操作,我们可以轻松地实现这一功能。希望本文对你理解和使用 Java 8 的 Stream API 有所帮助。

参考文献

  • [Java 8 Stream API Guide](
  • [Java 8官方文档](