我了解如何处理地图条目并将结果流收集到不同的地图中。但我需要使用构造函数来放置值,前一个映射的键被传递给我,我无法弄清楚如何去做。
方案如下:
我有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功能。如果答案包括解释为什么会起作用而不仅仅提供缺失的部分,我将非常感激。
答案 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);
这清楚地说明了如何组成各个步骤。一旦你以这种方式工作,你可以将它们组合成一个语句。