[英]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));
或者根本不初始化这些默认值,而是使用getOrDefault
或computeIfAbsent
:
int x = namesMap.getOrDefault(someName, 0);
int y = namesMap.computeIfAbsent(someName, s -> 0);
或者,如果您想获取名称的计数,您可以使用Collectors.groupingBy
和Collectors.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.