Перво-наперво, (a, b) -> a + ", " + b)
не будет компилироваться просто потому, что возвращаемое значение должно быть Subject
, а не String
, я полагаю, что вы в конце концов поняли это, учитывая ваши последние состояния редактирования, код теперь работает бездублирует при использовании функции слияния (a, b) -> a
.
Причина, по которой вы не получаете ожидаемый результат при вашем последнем обновлении, заключается в том, что вы используете функцию слияния (a, b) -> a
, означающую "если два заданных субъекта имеютзатем тот же самый ученик оставит первого ученика и отбросит второго ».
Вместо этого вам нужно как-то поддерживать обоих учеников, так что по сути у вас будет Map<Student, List<Subject>>
.
Это можно сделать следующим образом:
Map<Student, List<Subject>> result = markList
.stream()
.collect(Collectors.toMap(
Mark::getStudent,
v -> new ArrayList<>(singletonList(v.getSubject())),
(a, b) -> {a.addAll(b); return a;}));
На самом деле это лучше сделать через groupingBy
с mapping
в качестве нисходящего коллектора:
Map<Student, List<Subject>> resultSet = markList.stream()
.collect(groupingBy(Mark::getStudent,
mapping(Mark::getSubject, toList())));
и, наконец, вы можете проверить результаты с:
resultSet.forEach((student, subjects) ->
System.out.printf("%s %s : %s ", student.getFirstName(), student.getLastName(),
subjects.stream().map(Subject::getName).collect(joining(", "))));