簡體   English   中英

Java List <String>到Map <String,Integer> convertion

[英]Java List<String> to Map<String, Integer> convertion

我想從java 8中的List<String>轉換Map <String, Integer> ,如下所示:

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

因為我有一個字符串列表,我想創建一個Map,其中鍵是列表的字符串,值是Integer(零)。

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

我知道以“舊”方式轉換它很容易;

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

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

如前所述, Collectors.toMap的參數必須是函數,因此您必須將0更改為name -> 0 (您可以使用任何其他參數名稱而不是name )。

但請注意,如果names存在重復項,則會失敗,因為這會導致生成的映射中出現重復的鍵。 要解決此問題,您可以先通過Stream.distinct管道流:

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

或者根本不初始化這些默認值,而是使用getOrDefaultcomputeIfAbsent

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

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM