Java8分组Reduce

在Java8中,我们经常会使用Stream API来处理集合数据。其中一个常见的操作是将数据按照某个属性分组,然后对每组进行聚合操作。在这篇文章中,我们将介绍如何使用Java8的Stream API中的Collectors.groupingByCollectors.reducing方法来实现分组和reduce操作。

分组(Grouping)

在Java8中,Collectors.groupingBy方法可以根据指定的条件对数据进行分组。比如我们有一个包含Employee对象的List,我们可以按照Employee的部门对员工进行分组:

List<Employee> employees = Arrays.asList(
    new Employee("Alice", "Engineering", 5000),
    new Employee("Bob", "Engineering", 6000),
    new Employee("Charlie", "Sales", 4000),
    new Employee("David", "Sales", 4500)
);

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

employeesByDepartment.forEach((department, empList) -> {
    System.out.println(department + ": " + empList);
});

上面的代码将会输出:

Engineering: [Employee{name='Alice', department='Engineering', salary=5000}, Employee{name='Bob', department='Engineering', salary=6000}]
Sales: [Employee{name='Charlie', department='Sales', salary=4000}, Employee{name='David', department='Sales', salary=4500}]

Reduce

在Java8中,Collectors.reducing方法可以对数据进行reduce操作。比如我们有一个包含Employee对象的List,我们可以对员工的工资进行求和:

int totalSalary = employees.stream()
    .collect(Collectors.reducing(0, Employee::getSalary, Integer::sum));

System.out.println("Total salary: " + totalSalary);

上面的代码将会输出:

Total salary: 19500

分组Reduce

有时候我们需要对分组后的数据进行进一步的reduce操作。比如我们希望求每个部门的员工平均工资,我们可以结合groupingByreducing方法来实现:

Map<String, Integer> averageSalaryByDepartment = employees.stream()
    .collect(Collectors.groupingBy(Employee::getDepartment,
        Collectors.reducing(0, Employee::getSalary, Integer::sum) /
        Collectors.collectingAndThen(Collectors.counting(), Double::intValue)
    ));

averageSalaryByDepartment.forEach((department, averageSalary) -> {
    System.out.println(department + ": " + averageSalary);
});

上面的代码将会输出每个部门的员工平均工资。

类图

classDiagram
    class Employee {
        String name
        String department
        int salary
    }

总结

在本文中,我们介绍了如何使用Java8的Stream API中的Collectors.groupingByCollectors.reducing方法来实现分组和reduce操作。通过这些方法,我们可以方便地对集合数据进行分组和聚合操作,提高代码的可读性和简洁性。希望本文对您有所帮助!