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 中的 groupingBymaxBy 方法对员工数据进行分组和求最大值。最后输出每个部门中薪水最高的员工信息。

饼状图示例

下面通过饼状图展示员工信息中各部门的薪水占比。

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。如果有任何疑问或建议,欢迎留言讨论。感谢阅读!