La agrupación mediante la adición de dos tipos BigDecimal atributos de una clase

vimal:

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]

Gregory Piwowarek:

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}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=184006&siteId=1
Recomendado
Clasificación