Проблема со Stream API

Здравствуйте помогите разобраться со стримами. Есть Метод averageScoreByPupil - реализация этого метода несколько сложна, поскольку в данном случае требуется выполнить промежуточный сбор данных в Map(). Опишем вкратце алгоритм:

  • flatMap() для преобразования в поток объектов Subject;
  • метод collect() в который мы передаем метод groupingBy() (минимум с двумя параметрами) класса Collectors. При этом карта собирается следующим образом: ключ - это имя предмета, значение - средний балл по этому предмету для каждого ученика. Для расчета среднего балла используйте метод avergagingDouble() класса Collectors;
  • после этого собранную карту мы разбираем с помощью entrySet() и открываем поток с помощью stream();
  • полученный поток с помощью map() преобразуем в поток объектов класса Tuple, внутри метода мы будем создавать эти объекты - там будет фигурировать строка new Tuple();
  • в конструктор мы будем передавать параметры с помощью методов getKey() и getValue() интерфейса Entry;
  • последним методом будет collect(), с помощью которого мы все соберем в коллекцию List.

Что надо передать и каким образом в Collectors.averagingDouble() не могу понять ?

public static List<Tuple> averageScoreByPupil(Stream<Pupil> stream) {

    Map<String, Double> map = stream.flatMap(x -> x.getSubjects()
             .stream()
             .collect(Collectors.groupingBy(x.getName(), Collectors.averagingDouble())));
    return map.entrySet()
            .stream()
            .map(x -> new Tuple(x.getKey(), x.getValue()))
            .collect(Collectors.toList());

  }

Ответы (1 шт):

Автор решения: IR42
Map<String, Double> map = stream
        .flatMap(pupil -> pupil.getSubjects().stream()) // получаем Stream<Subject>
        .collect(
            Collectors.groupingBy(
                subject -> subject.getName(),
                Collectors.averagingDouble(subject -> subject.getScore())
            )
        );

Чуть короче с Method References:

Map<String, Double> map = stream
        .flatMap(pupil -> pupil.getSubjects().stream()) // получаем Stream<Subject>
        .collect(
            Collectors.groupingBy(
                Subject::getName,
                Collectors.averagingDouble(Subject::getScore)
            )
        );
→ Ссылка