Java 8 分组之后求和
引言
在开发过程中,我们经常需要对数据进行分组并对每个分组进行求和操作。在 Java 8 中,我们可以使用 Stream API 来轻松地实现这一功能。本文将介绍如何在 Java 8 中使用 Stream API 对数据进行分组并求和,并通过代码示例来说明。
Stream API 简介
Stream API 是 Java 8 中新增的一个功能强大的库,用于处理集合(Collection)数据。它提供了一种声明式的方式来操作数据,可以极大地简化代码,并且支持并行操作,提高了程序的执行效率。
Stream API 提供了一系列的操作,如过滤、映射、排序、归约等,用于对集合数据进行处理。其中,groupingBy
和 summingInt
是我们在本文中要用到的两个操作。
分组和求和示例
假设我们有一个包含员工信息的列表,每个员工有姓名、部门和薪水三个属性。我们希望按照部门对员工进行分组,并计算每个部门的薪水总和。
首先,我们需要定义一个 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 对数据进行分组并求和的方法。通过使用 groupingBy
和 summingInt
操作,我们可以轻松地实现这一功能。希望本文对你理解和使用 Java 8 的 Stream API 有所帮助。
参考文献
- [Java 8 Stream API Guide](
- [Java 8官方文档](