2017-02-27 65 views
4

我想一個Map <String, Integer>List<String>轉換在Java 8是這樣的:Java列表<String>地圖<字符串,整數>皈依

Map<String, Integer> namesMap = names.stream().collect(Collectors.toMap(name -> name, 0)); 

,因爲我有一個字符串列表,而且我喜歡創建一個Map,其中鍵是列表的字符串,並且值是整數(零)。

我的目標是計算字符串列表的元素(稍後在我的代碼中)。

我知道很容易將它轉換成「舊」的方式;

Map<String,Integer> namesMap = new HasMap<>(); 
for(String str: names) { 
    map1.put(str, 0); 
} 

但我想知道還有一個Java 8解決方案。

+7

只是改變'0'到'名字 - > 0':'地圖<字符串,整數> namesMap = names.stream()。collect(Collectors.toMap(name - > name,name - > 0));'但是如果你有重複的話,這將失敗。如果要計算出現次數,首先要做的就是:Map namesMap = names.stream()。collect(Collectors.groupingBy(name - > name,Collectors.counting()));'除了'name - > name',你也可以使用'Function.identity()'。 – Holger

+0

哦,它工作,謝謝! :) – LakiGeri

回答

6

如前所述,該參數Collectors.toMap必須的功能,所以你必須改變0name -> 0(你可以使用任何其他參數名稱而不是name)。

但是,請注意,如果names中存在重複項,將會失敗,因爲這會導致生成的映射中出現重複鍵。爲了解決這個問題,你可以通過管道流Stream.distinct第一:

Map<String, Integer> namesMap = names.stream().distinct() 
            .collect(Collectors.toMap(s -> s, s -> 0)); 

還是不初始化這些默認值在所有,使用或getOrDefault代替computeIfAbsent

int x = namesMap.getOrDefault(someName, 0); 
int y = namesMap.computeIfAbsent(someName, s -> 0); 

或者,如果你想得到了名的計數,你可以只使用Collectors.groupingByCollectors.counting

Map<String, Long> counts = names.stream().collect(
     Collectors.groupingBy(s -> s, Collectors.counting())); 
5

toMap收集器收到兩個映射器 - 一個用於密鑰,另一個用於值。鍵映射器可以僅返回列表中的值(即,像您目前擁有的name -> name或僅使用內置Function.Identity)。該值映射器應該只是返回的0硬編碼值任意鍵:

namesMap = 
    names.stream().collect(Collectors.toMap(Function.identity(), name -> 0)); 
+2

是不是'Integer'只是(恕我直言,而不是很好的選擇)參數的lambda在這裏的名稱? –

+0

@Eugene好點。編輯並修復。它絕對使代碼看起來更清晰。 – Mureinik

相關問題