Проблема со 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)
)
);