当前位置: 首页 > 知识库问答 >
问题:

lambda表达式字符串中的错误返回类型无法转换为对象

韩弘阔
2023-03-14

如果会发生重复,我需要确认数据。但不能这样做。

在这种情况下,是否可以将字符串转换为对象,或通过另一个表达式连接该数据?

我有一个问题:(a, b)-

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\u 1(带subject\u 1)、subject\u 2(带subject\u 1)和student\u 2(带subject\u 1(带subject\u 1)):

约翰·麦克唐纳:数学、天文学

Kira Wild:数学

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

但此代码没有重复项,如下所示:(a,b)-

输出:

约翰·麦克唐纳:数学

Kira Wild:数学


共有1个答案

锺离辰沛
2023-03-14

首先,(a, b)-

鉴于您的最新更新,您没有得到预期结果的原因是您正在使用合并函数(a, b)-

相反,您要做的是以某种方式维护两个学生,因此本质上,您将有一个映射

这可以通过以下方式完成:

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使用映射作为下游收集器来完成:

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

 类似资料: