Quiero suma de dos atributos de tipo BigDecimal de la misma clase y agrupándolos con algún otro atributo de la clase.
He intentado utilizar el método Collectors.reducing () Collectors.groupingBy () y pero esto es aplicable para un único atributo que se puede resumir.
clase empleado tiene atributos a continuación:
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)));
De acuerdo con la última pieza del código, Collectors.reducing () Quiero suma de salarios y bonos que se agrupan junto con los respectivos departamentos. Por ejemplo,
Departamento A -
Empleado 1- Sueldo 1000, Bonus 100
Empleado 2- Sueldo 2000, Bonus 100
Departamento B -
Empleado 3 - Salario 5000, Bono 100
Ahora quiero un mapa, como a continuación:
[Departamento-A, 3200], [Departamento-b, 5100]
Con el fin de lograr ese efecto, es necesario combinar dos por separado Collectors
: groupingBy () y reducir ():
Map<String, BigDecimal> result = employeeList.stream()
.collect(Collectors
.groupingBy(Employee::getDepartment, Collectors
.reducing(BigDecimal.ZERO, e -> e.getBonus().add(e.getSalary()), BigDecimal::add)));
salida: {DepartmentB=5100, DepartmentA=3200}