Группировка путем добавления двух атрибутов типа BigDecimal класса - PullRequest
0 голосов
/ 08 января 2019

Я хочу получить сумму двух атрибутов типа BigDecimal одного и того же класса и сгруппировать их с некоторым другим атрибутом класса.

Я пытался использовать методы Collectors.groupingBy () и Collectors.reduc (), но это применимо только для одного атрибута, который можно суммировать.

Класс сотрудника имеет следующие атрибуты:

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.reduc () Я хочу сумму зарплаты и бонусов, которые будут сгруппированы вместе с соответствующими отделами. Например,

Отдел А -

Сотрудник 1- Зарплата 1000, Бонус 100

Сотрудник 2 - Зарплата 2000, Бонус 100

Отдел B -

Сотрудник 3 - Зарплата 5000, Бонус 100

Теперь я хочу карту, как показано ниже:

[Отдел-А, 3200], [Отдел-б, 5100]

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Сначала определите метод следующим образом:

 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.toMap(Employee::getDepartment,
                                      Employee::getSumOfBonusAndSarary,BigDecimal::add))
0 голосов
/ 08 января 2019

Чтобы достичь этого эффекта, вам нужно объединить два отдельных Collectors: groupingBy () и Reduction ():

Map<String, BigDecimal> result = employeeList.stream()
      .collect(Collectors
        .groupingBy(Employee::getDepartment, Collectors
          .reducing(BigDecimal.ZERO, e -> e.getBonus().add(e.getSalary()), BigDecimal::add)));

Выход: {DepartmentB=5100, DepartmentA=3200}

...