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

Java 通过添加类的两个BigDecimal类型属性进行分组,java,java-8,java-stream,Java,Java 8,Java Stream,我想要相同类的两个BigDecimal类型属性的总和,并将它们与该类的其他属性分组 我尝试使用Collectors.groupingBy()和Collectors.reduce()方法,但这只适用于一个可以求和的属性 Employee类具有以下属性: class Employee{ private String name; private BigDecimal salary; private BigDecimal bonus; private String department; /

我想要相同类的两个BigDecimal类型属性的总和,并将它们与该类的其他属性分组

我尝试使用Collectors.groupingBy()和Collectors.reduce()方法,但这只适用于一个可以求和的属性

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)));
根据最后一段代码,Collectors.reduction()我想要工资和奖金的总和,这将与相应的部门一起分组。比如说,

A系-

员工1-工资1000,奖金100

员工2-工资2000,奖金100

B系-

员工3-工资5000,奖金100

现在我想要一张如下所示的地图:


[Department-A,3200],[Department-b,5100]

为了实现这一效果,您需要组合两个独立的
收集器:groupingBy()和reduce():

Map result=employeeList.stream()
.收藏(收藏家)
.groupingBy(员工::getDepartment,催收员)
.减少(BigDecimal.ZERO,e->e.getBonus().add(e.getSalary()),BigDecimal::add));
输出:
{DepartmentB=5100,DepartmentA=3200}

首先定义如下方法:

 public BigDecimal getSumOfBonusAndSarary(){
    return this.bonus.add(this.salary);
}
然后使用

employees.stream().collect(Collectors.groupingBy(
            Employee::getDepartment, Collectors.reducing(
                    BigDecimal.ZERO,
                    Employee::getSumOfBonusAndSarary,
                    BigDecimal::add)));
甚至可以使用
toMap()


试试这个
employees.stream().collect(Collectors.groupingBy(Employee::getDepartment,Collectors.reduced(BigDecimal.ZERO,Employee::getSum,BigDecimal::add))
并定义一个方法,比如
BigDecimal getSum(){返回this.bonus.add(this.salary);}
我喜欢使用
收集器.toMap
:)实际上我不想更改类。我使用了下面的代码:Map depatMaps=employeeList.stream().collect(Collectors.groupby(em->em.getDepartment(),Collectors.reduce(bigdecim.ZERO,emp->emp.getBonus().add(emp.getSalary()),bigdecimic::add));toMap()方法看起来也不错,我在下面使用时没有更改类及其工作原理:employeeList.stream().collect(Collectors.toMap(emp->emp.getDepartment(),em->em.getBonus().add(em.getSalary()),BigDecimal::add));我添加该方法只是为了简化。换句话说,OP使用了一个类似于
映射器
双函数
的函数来减少
,而它应该是一个
函数
,即
e->..
,而不是你的答案所示的
(e,a)->
employees.stream().collect(Collectors.groupingBy(
            Employee::getDepartment, Collectors.reducing(
                    BigDecimal.ZERO,
                    Employee::getSumOfBonusAndSarary,
                    BigDecimal::add)));
 employees.stream()
            .collect(Collectors.toMap(Employee::getDepartment,
                                      Employee::getSumOfBonusAndSarary,BigDecimal::add))