lambda 表达式中的错误 return 类型 String 无法转换为 Object

Bad return type in lambda expression String cannot be converted to Object

如果出现重复,我需要连接数据。但是做不到。

在这种情况下是否可以将 String 转换为 Object 或通过另一个表达式连接该数据?

我有一个问题:(a, b) -> a + ", " + b lambda 表达式中的错误 return 类型 String 无法转换为 Subject

Map<Student, Subject> result = markList
           .stream()
           .collect(Collectors.toMap(
                  Mark::getStudent,
                  Mark::getSubject,
               (a, b) -> a + ", " + b));

result.forEach((student, subject) -> 
         System.out.printf("%s %s : %s ", student.getFirstName(), 
                   student.getLastName(), subject.getName()));

这是标记列表:

List<Mark> markList = new ArrayList<>();
markList.add(new Mark(student_1, subject_1, 1));
markList.add(new Mark(student_1, subject_2, 2));
markList.add(new Mark(student_2, subject_1, 1));

并期望获得加入的主题数据以防发现重复项

预期输出:

[student_1subject_1subject_2student_2subject_1]:

John McDonald: Mathematics, Astronomy

Kira Wild: Mathematics

============================================= ========

但是 此代码没有重复项:(a, b) -> a

输出:

John McDonald: Mathematics

Kira Wild: Mathematics

首先,(a, b) -> a + ", " + b) 将无法编译,因为返回值必须是 Subject 而不是 String,我相信您最终已经根据最新的解决方案解决了这个问题编辑状态代码现在在使用 (a, b) -> a 合并功能时没有重复。

您在最新更新后未获得预期结果的原因是您正在使用合并功能 (a, b) -> a,这意味着 "if two given Subjects have the same Student then keep the first student and discard the second"。

相反,您想做的是以某种方式维持两个学生,因此从本质上讲,您将拥有 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;}));

实际上,最好通过 groupingBymapping 作为下游收集器来完成:

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(", "))));