Вы были достаточно близки, если бы использовали forEach
для повторения набора ключей снова как:
Map<Status, Student> map = new HashMap<>();
studentList.forEach(student ->
student.getStatusAndMarks().keySet()
.forEach(k -> map.put(k,student)));
Представление, аналогичное указанному в другом ответе, будет
Map<Status, Student> map = studentList.stream()
.flatMap(s -> s.getStatusAndMarks().keySet()
.stream()
.map(status -> new AbstractMap.SimpleEntry<>(status, s)))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (a, b) -> b));
Обратите внимание, функция слияния предназначена для перезаписи нового студента с таким же статусом, который будет найден позже в итерации С другой стороны, что действительно может быть полезной для запроса информации, так это список студентов, которым присвоен статус. Они могут быть сгруппированы с использованием аналогичного потокового конвейера следующим образом:
Map<Status, List<Student>> statusWiseStudent = studentList.stream()
.flatMap(s -> s.getStatusAndMarks().keySet()
.stream()
.map(status -> new AbstractMap.SimpleEntry<>(status, s)))
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue, Collectors.toList())));