группировка по функции и сборщик настраиваемых объектов в качестве параметров - PullRequest
0 голосов
/ 19 июня 2020

У меня есть нижеследующее требование, которое может быть простым, но как новичок я хотел бы воспользоваться здесь помощью.

class Employee{
  String department;
  int age;
  int salary;
}

class Foo{
  double averagingAge;
  double averagingSalary;
}

Я хочу иметь группу по отделам, используя groupingBy(department, collector(Foo)). Кто-нибудь может помочь?

1 Ответ

0 голосов
/ 14 июля 2020
custom collector is the solution in java8: 

class Foo{
  private double ageSum;
  private double salarySum;
  private long ageCount;
  private long salaryCount;

    public double getAgeAvg(){
        return ageCount != 0 ? ageSum/ageCount : 0.0;
    }

    public double getSalaryAvg(){
        return salaryCount != 0 ? salarySum/salaryCount : 0.0;
    }
}

нестандартный сборщик:

Map<Department, Foo> groupByResult = empList.stream().collect(groupingBy(department,
                Collector.of(
                        () -> {
                            return new Foo();
                        },
                        (result, emp) -> {
                            result.setAgeSum(result.getAgeSum() + emp.getAge());
                            result.setSalarySum(result.getSalarySum() + emp.getSalarySum());
                            result.setSalaryCount((result.getSalaryCount()) + 1);
                            result.setAgeCount(result.getAgeCount() + 1);
                        },
                        (result1, result2) -> {
                            result1.setSalarySum(result1.getSalarySum() + result2.getSalarySum());
                            result1.setAgeSum(result1.getAgeSum() + result2.getAgeSum());
                            result1.setAgeCount(result1.getAgeCount() + result2.getAgeCount());
                            result1.setSalaryCount(result1.getSalaryCount() + result2.getSalaryCount());
                            return result1;
                        }
        ));
...