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

自闭症网瘾萝莉.ら 提交于 2020-08-19 06:45:56

问题


I'd like to convert a Map <String, Integer> from List<String> in java 8 something like this:

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

because I have a list of Strings, and I'd like to to create a Map, where the key is the string of the list, and the value is Integer (a zero).

My goal is, to counting the elements of String list (later in my code).

I know it is easy to convert it, in the "old" way;

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

but I'm wondering there is a Java 8 solution as well.


回答1:


As already noted, the parameters to Collectors.toMap have to be functions, so you have to change 0 to name -> 0 (you can use any other parameter name instead of name).

Note, however, that this will fail if there are duplicates in names, as that will result in duplicate keys in the resulting map. To fix this, you could pipe the stream through Stream.distinct first:

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

Or don't initialize those defaults at all, and use getOrDefault or computeIfAbsent instead:

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

Or, if you want to get the counts of the names, you can just use Collectors.groupingBy and Collectors.counting:

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



回答2:


the toMap collector receives two mappers - one for the key and one for the value. The key mapper could just return the value from the list (i.e., either name -> name like you currently have, or just use the builtin Function.Identity). The value mapper should just return the hard-coded value of 0 for any key:

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


来源:https://stackoverflow.com/questions/42486898/java-liststring-to-mapstring-integer-convertion

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!