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

Lak*_*eri 6 java java-8 java-stream

我想转换一个Map <String, Integer>List<String>Java中像这样的东西8:

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

因为我有一个字符串列表,我想创建一个Map,其中键是列表的字符串,值是Integer(零).

我的目标是,计算字符串列表的元素(稍后在我的代码中).

我知道以"旧"方式转换它很容易;

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

但我想知道还有一个Java 8解决方案.

tob*_*s_k 12

如前所述,参数Collectors.toMap必须是函数,因此您必须更改0name -> 0(您可以使用任何其他参数名称而不是name).

但请注意,如果存在重复项,则会失败names,因为这会导致生成的映射中出现重复的键.要解决此问题,您可以首先管道流Stream.distinct:

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

或者根本不初始化这些默认值,并使用getOrDefaultcomputeIfAbsent改为:

int x = namesMap.getOrDefault(someName, 0);
int y = namesMap.computeIfAbsent(someName, s -> 0);
Run Code Online (Sandbox Code Playgroud)

或者,如果您想获取名称的计数,您可以使用Collectors.groupingByCollectors.counting:

Map<String, Long> counts = names.stream().collect(
        Collectors.groupingBy(s -> s, Collectors.counting()));
Run Code Online (Sandbox Code Playgroud)


Mur*_*nik 7

所述toMap收集器接收两个映射器-一个用于密钥和一个为值.键映射器只能从列表中返回值(即,name -> name就像您当前拥有的那样,或者只是使用内置函数Function.Identity).值映射器应该只返回0任何键的硬编码值:

namesMap = 
    names.stream().collect(Collectors.toMap(Function.identity(), name -> 0));
Run Code Online (Sandbox Code Playgroud)

  • 是不是`整数`只是(恕我直言,选择不当)lambda参数的名称? (2认同)