我有一个interface Course
和class 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元素是实现
CourseCLS
的Course
实例,因此您可以将它们收集到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
的类型推断检测此构造的有效性。