我有一个interface Courseclass CourseCLS implements Course

首先,我尝试按相同的数字对CourseCLS对象进行分组。我不确定是否正确。

Map<Integer, List<CourseCLS>> first =
        courses.values().stream()
            .collect(Collectors.groupingBy(c -> c.getNumber()));


现在,我需要将Map<Integer, List<CourseCLS>>更改为Map<Integer, List<Course>>,然后将其返回。

有什么想法怎么做?

刚刚解决了将此添加到分组:

groupingBy(c -> c.overHeadPercentage(),
    Collectors.mapping(p -> (Course) p, Collectors.toList()))

最佳答案

您正在尝试解决不存在的问题。写吧

Map<Integer, List<Course>> first =
    courses.values().stream()
        .collect(Collectors.groupingBy(c -> c.getNumber()));


由于Stream元素是实现CourseCLSCourse实例,因此您可以将它们收集到List<Course>中,而无需执行任何其他操作。



如果Course接口没有getNumber方法,而只有具体的CourseCLS类,则可能出现唯一的问题,因为上面的收集器现在正在收集Course实例。但是即使没有任何映射步骤也可以解决:

Map<Integer, List<Course>> first =
    courses.values().stream()
        .collect(Collectors.groupingBy(c -> c.getNumber(), Collectors.toList()));


由于groupingBy允许下游收集器收集比其自身收集更广泛的类型,因此您可以将toList()收集器(收集Course实例)与groupingBy收集器(收集CourseCLS实例)组合在一起。 Java 8的类型推断检测此构造的有效性。

10-06 06:38