Vim*_*mal 4 java java-8 java-stream
我想要同一类的两个BigDecimal类型属性的总和,并将它们与该类的某些其他属性分组。
我尝试使用Collectors.groupingBy()和Collectors.reducing()方法,但这仅适用于可以汇总的一个属性。
Employee类具有以下属性:
class Employee{
private String name;
private BigDecimal salary;
private BigDecimal bonus;
private String department;
// Getters and Setters
}
employeeList.stream().collect(Collectors.groupingBy(
Employee::getDepartment, Collectors.reducing(
BigDecimal.ZERO,
(id, emp) -> id.add(emp.getSalary().add(emp.getBonus)),
BigDecimal::add)));
Run Code Online (Sandbox Code Playgroud)
根据代码的最后一部分,Collectors.reducing(),我希望将薪金和奖金的总和与各个部门一起分组。例如,
部门A-
员工1-工资1000,奖金100
员工2-薪金2000,奖金100
部门B-
员工3-薪金5000,奖金100
现在我想要一张像下面的地图:
[部门A,3200],[部门B,5100]
为了达到该效果,您需要将两个单独的组合Collectors:groupingBy()和reduce():
Map<String, BigDecimal> result = employeeList.stream()
.collect(Collectors
.groupingBy(Employee::getDepartment, Collectors
.reducing(BigDecimal.ZERO, e -> e.getBonus().add(e.getSalary()), BigDecimal::add)));
Run Code Online (Sandbox Code Playgroud)
输出:
{DepartmentB=5100, DepartmentA=3200}