Java Stream 之 Group 和 Max
在 Java 编程中,Stream 是一个非常强大和灵活的 API,它提供了一种高效的方式来处理集合数据。Stream API 通过流式操作,可以轻松实现数据的筛选、排序、映射等操作,而且代码简洁优雅。
在 Stream 中,经常会遇到需要对数据进行分组并找到每组中的最大值的情况。本文将通过示例代码详细介绍如何使用 Java Stream 实现对数据进行分组并找到每组中的最大值。
分组并找到最大值
假设我们有一个包含员工信息的列表,每个员工包括姓名、部门和薪水。我们需要根据部门对员工进行分组,并找到每个部门中薪水最高的员工。
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Employee {
private String name;
private String department;
private double salary;
public Employee(String name, String department, double salary) {
this.name = name;
this.department = department;
this.salary = salary;
}
public String getName() {
return name;
}
public String getDepartment() {
return department;
}
public double getSalary() {
return salary;
}
public String toString() {
return "Employee{name='" + name + "', department='" + department + "', salary=" + salary + "}";
}
public static void main(String[] args) {
List<Employee> employees = Arrays.asList(
new Employee("Alice", "HR", 5000),
new Employee("Bob", "IT", 6000),
new Employee("Charlie", "HR", 5500),
new Employee("David", "IT", 7000),
new Employee("Eve", "Sales", 4500),
new Employee("Frank", "Sales", 4800)
);
Map<String, Employee> maxSalaryByDepartment = employees.stream()
.collect(Collectors.groupingBy(Employee::getDepartment,
Collectors.collectingAndThen(
Collectors.maxBy((e1, e2) -> Double.compare(e1.getSalary(), e2.getSalary())),
Optional::get
)));
maxSalaryByDepartment.forEach((department, employee) -> {
System.out.println("Department: " + department + ", Employee with max salary: " + employee.toString());
});
}
}
在上面的示例代码中,我们首先创建了 Employee 类表示员工信息,包括姓名、部门和薪水。然后创建了一个包含员工信息的列表。接着使用 Stream API 中的 groupingBy 和 maxBy 方法对员工数据进行分组和求最大值。最后输出每个部门中薪水最高的员工信息。
饼状图示例
下面通过饼状图展示员工信息中各部门的薪水占比。
pie
title Employee Salary Distribution by Department
"HR": 20
"IT": 30
"Sales": 15
通过饼状图我们可以清晰地看到各个部门的薪水占比,有助于更直观地了解数据分布情况。
状态图示例
接下来我们将使用状态图展示 Stream 对员工数据进行分组和找到最大值的流程。
stateDiagram
[*] --> GroupBy
GroupBy --> MaxBy
MaxBy --> PrintResult
PrintResult --> [*]
状态图清晰地展示了整个流程,从数据分组到求最大值再到打印结果的一系列操作。
结语
本文通过一个实际的示例代码详细介绍了如何使用 Java Stream 对数据进行分组并找到每组中的最大值。通过 Stream API 的强大功能,我们可以轻松实现对复杂数据的处理和分析。希望本文能够帮助读者更好地理解和运用 Java Stream。如果有任何疑问或建议,欢迎留言讨论。感谢阅读!
















