Java8分组Reduce
在Java8中,我们经常会使用Stream API来处理集合数据。其中一个常见的操作是将数据按照某个属性分组,然后对每组进行聚合操作。在这篇文章中,我们将介绍如何使用Java8的Stream API中的Collectors.groupingBy
和Collectors.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操作。比如我们希望求每个部门的员工平均工资,我们可以结合groupingBy
和reducing
方法来实现:
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.groupingBy
和Collectors.reducing
方法来实现分组和reduce操作。通过这些方法,我们可以方便地对集合数据进行分组和聚合操作,提高代码的可读性和简洁性。希望本文对您有所帮助!