Преобразовать List в Map>
С помощью stream api нужно преобразовать список студентов в Map, где ключ - возраст студента, а значение - список студентов, возраст которых совпадает с ключом. Класс студента:
public class Student {
private int id;
private String name;
private int age;
//конструктор, геттеры
}
Я сделал способом, который показан ниже, но преподаватель говорит, что это можно сделать только с помощью stream. А я всё никак не могу понять, как внутри стрима сопоставить ключ со значениями, помогите, пожалуйста.
private static Map<Integer, List<Student>> listToMap(List<Student> students) {
Map<Integer, List<Student>> result = new HashMap<>();
students.forEach(s -> result.put(
s.getAge(), students.stream().filter(v -> v.getAge() == s.getAge())
.collect(Collectors.toList())
)
);
return result;
}
Ответы (1 шт):
Автор решения: Дмитрий
→ Ссылка
Это довольно просто:
private static Map<Integer, List<Student>> listToMap(List<Student> students) {
return students.stream().collect(Collectors.groupingBy(Student::getAge, Collectors.mapping(Function.identity(), Collectors.toList())));
}
А если добавить второй аргумент, то сможете группировать по любому полю:
private static<T> Map<T, List<Student>> listToMap(List<Student> students, Function <Student, T> function) {
return students.stream().collect(Collectors.groupingBy(function::apply, Collectors.mapping(Function.identity(), Collectors.toList())));
}
вызов метода будет выглядеть примерно так: listToMap(students, Student::getAge); ну и вместо getAge можно подставить любой геттер класса Student, управляя способом групировки