通过添加类的两个BigDecimal类型属性进行分组

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]

Grz*_*rek 5

为了达到该效果,您需要将两个单独的组合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}