2016-06-28 60 views
0

我了解如何处理地图条目并将生成的流收集到不同的地图中。但我需要使用一个构造函数来传递前一个地图的关键字,我不知道如何去做。Java 8流:收集地图到地图和构造函数

的情况如下:

我有一个Map<Event, EventSchedule> schedules,我想从它Map<Event, InverseSchedule>InverseScheduleEvent构成,正好在schedules中的每个关键字。

这是我尝试过,到目前为止,我只是一块远离终于实现我追求的:

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

我已经试过InverseSchedule::new但当然不行,因为我没有传递任何参数,而且我也无法使用lambda表达式。

我仍然在努力理解这些新的Java 8功能。我真的很感激,如果答案包括为什么它的工作的解释,而不是只提供缺少的一块。

+4

'InverseSchedule :: new',假设有一个'InverseSchedule'的构造函数接受'Event'? – Tunaki

+2

为什么'InverseSchedule :: new'不工作? Stream会将参数传递给它,它将成为一个Event。如果你能向我们展示所提到的构造函数,那将是最好的。 –

+2

如果你想要回答这个问题,你应该添加关于你的类的信息 - 这些不是标准Java库中的类,所以我们不知道它们提供了什么构造函数或方法。你如何从'Event'中创建'InverseSchedule'?你不想要任何值('EventSchedule')的信息吗?请[编辑]你的问题,并扩大。 – RealSkeptic

回答

0

下将工作用正确的构造函数。此外,schedules.get()不是必需的。

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

可以在lambda表达式

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

如果'event - > new InverseSchedule(event)'工作,'InverseSchedule :: new'也应该工作。 – Holger

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); 

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