地图<整数,列表<coursecls =“”>&gt;映射<integer,list <course =“”>&gt;

时间:2016-06-29 20:05:48

标签: java dictionary java-8 java-stream

我有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:

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

2 个答案:

答案 0 :(得分:6)

您正在尝试解决不存在的问题。只需写下

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

由于Stream元素是实现CourseCLS的{​​{1}}的实例,因此您可以将它们收集到Course中,而无需任何其他操作。

如果List<Course>接口没有Course方法,但只有具体的getNumber类,可能会出现唯一可能出现的问题,因为上面的收集器正在收集{{ 1}}实例。但即使这样也可以在没有任何映射步骤的情况下解决:

CourseCLS

由于Course允许下游收集器收集比自身收集的更广泛的类型,因此您可以将Map<Integer, List<Course>> first = courses.values().stream() .collect(Collectors.groupingBy(c -> c.getNumber(), Collectors.toList())); 收集器收集groupingBy实例与收集toList()收集器的Course收集器合并{1}}个实例。 groupingBy的类型推断检测到此构造的有效性。

答案 1 :(得分:1)

由于CourseCLS实现课程,您只需创建一个以课程为值的新地图,它将接受课程界面的任何实例,因此将接受CourseCLS。 因此,请查看您的第一张地图,并将每个K,V对添加到结果地图