Java 通过添加类的两个BigDecimal类型属性进行分组
我想要相同类的两个BigDecimal类型属性的总和,并将它们与该类的其他属性分组 我尝试使用Collectors.groupingBy()和Collectors.reduce()方法,但这只适用于一个可以求和的属性 Employee类具有以下属性: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; /
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))