2016-06-28 63 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); 

這就清楚地說明了各個步驟是如何組成的。一旦你以這種方式工作,你可以將它們組合成一個單一的聲明。