Java 8流:将地图收集到地图和构造函数

时间:2016-06-28 18:43:38

标签: java java-8

我了解如何处理地图条目并将结果流收集到不同的地图中。但我需要使用构造函数来放置值,前一个映射的键被传递给我,我无法弄清楚如何去做。

方案如下:

我有Map<Event, EventSchedule> schedules,我希望从中获得Map<Event, InverseSchedule>InverseSchedule使用Event构建,恰好是schedules中的每个键。

这是我到目前为止所尝试的内容,而且我距离最终实现我所追求的目标还有一段距离:

Map<Event, InverseSchedule> inverseSchedules = schedules.get()
        .keySet()
        .stream()
        .collect(Collectors.toMap(Function.identity(), ???));

我已经尝试InverseSchedule::new但当然这不起作用,因为我没有传递任何参数,我也不能使用lambda。

我仍然在努力理解这些新的Java 8功能。如果答案包括解释为什么会起作用而不仅仅提供缺失的部分,我将非常感激。

3 个答案:

答案 0 :(得分:0)

您可以在lambda表达式中使用正确的构造函数

Map<Event, InverseSchedule> inverseSchedules = schedules.keySet()
    .stream()
    .collect(Collectors.toMap(Function.identity(), event -> new InverseSchedule(event));

答案 1 :(得分:0)

以下情况可行。此外,schedules.get()不是必需的。

Map<Event, InverseSchedule> inverseSchedules = schedules
    .keySet()
    .stream()
    .collect(Collectors.toMap(Function.identity(), event -> new InverseSchedule(event));

答案 2 :(得分:0)

在构建复杂流时,通常很难跟踪所有隐式通用参数,因此,如果我遇到问题,我通常的做法是暂时将流构建分解为单个语句,因此:

    Map<Event,EventSchedule> map1 = new HashMap<>();
    Set<Event> ks = map1.keySet();
    Stream<Event> st = ks.stream();
    Collector<Event,?,Map<Event,InverseSchedule>> coll = Collectors.toMap(Function.identity(), e -> new InverseSchedule(e));
    Map<Event,InverseSchedule> map2 = st.collect(coll);

这清楚地说明了如何组成各个步骤。一旦你以这种方式工作,你可以将它们组合成一个语句。