【问题标题】:Map<Integer, List<courseCLS>> to Map<Integer, List<Course>>Map<Integer, List<courseCLS>> 到 Map<Integer, List<Course>>
【发布时间】:2016-06-29 20:05:48
【问题描述】:

我有一个interface Course 和一个class CourseCLS implements Course

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

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

现在我需要把Map&lt;Integer, List&lt;CourseCLS&gt;&gt;改成Map&lt;Integer, List&lt;Course&gt;&gt;,然后返回。

有什么办法吗?

刚刚解决了将其添加到 groupingBy:

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

【问题讨论】:

  • 你可以直接施放它(虽然你会得到一个警告)。但是为什么不将first 声明为您需要返回的类型呢? Course 没有getNumber() 吗?你在用地图做其他事情吗?

标签: java dictionary java-8 java-stream


【解决方案1】:

您正在尝试解决一个不存在的问题。随便写

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

由于 Stream 元素是实现 CourseCourseCLS 的实例,因此您可以将它们收集到 List&lt;Course&gt; 中,而无需任何额外操作。


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

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

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

【讨论】:

    【解决方案2】:

    由于 CourseCLS 实现了 Course,您可以创建一个以 Course 作为值的新地图,它将接受 Course 接口的任何实例,因此将接受 CourseCLS。 所以浏览你的第一张地图并将每个 K,V 对添加到结果地图中

    【讨论】:

    • 你能准确地写代码吗?我试过了,但没有用。
    • 让你 Map&lt;Integer, List&lt;CourseCLS&gt;&gt; first 完成,只需执行以下操作:Map&lt;Integer, List&lt;Course&gt;&gt; second = new HashMap(); first.forEach(second::putIfAbsent); 这会将第一个的每个 K、V 添加到第二个中,而无需替换键。
    猜你喜欢
    • 2022-09-30
    • 2014-05-04
    • 1970-01-01
    • 2014-02-05
    • 2015-10-03
    • 1970-01-01
    • 2017-01-28
    • 2023-03-26
    • 2014-01-08
    相关资源
    最近更新 更多