Java List <string> to Map <string,integer =“”> convertion

时间:2017-02-27 13:22:52

标签: java java-8 java-stream

我想在java 8中将Map <String, Integer>转换为List<String>,如下所示:

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解决方案。

2 个答案:

答案 0 :(得分:10)

如前所述,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()));

答案 1 :(得分:6)

toMap收集器收到两个映射器 - 一个用于密钥,另一个用于值。密钥映射器可以只返回列表中的值(即,像您当前拥有的name -> name,或者只使用内置Function.Identity)。值映射器应该只为任何键返回0的硬编码值:

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