Java8如何用flatMap将Map<String,List<String>>转为Map<String,Integer>
问题解答
常规实现方式(更简洁高效)
其实不用flatMap就能轻松搞定,而且这是最直接的方案:
Map<String, List<String>> originalMap = new HashMap<>(); // 先填充好原始数据 Map<String, Integer> resultMap = originalMap.entrySet() .stream() .collect(Collectors.toMap( Map.Entry::getKey, entry -> entry.getValue().size() ));
直接遍历原Map的每个键值对,把key保留,value换成对应List的元素个数就行,简单高效。
用flatMap的实现方式(可行但没必要)
如果硬要用上flatMap,也能实现,但属于绕远路的做法:
Map<String, Integer> resultWithFlatMap = originalMap.entrySet() .stream() // 把每个List里的元素都映射成对应的key,这样key会重复List.size()次 .flatMap(entry -> entry.getValue().stream().map(item -> entry.getKey())) // 统计每个key的出现次数,得到Map<String, Long> .collect(Collectors.groupingBy( Function.identity(), Collectors.counting() )) // 把Long类型转成Integer,得到目标Map .entrySet() .stream() .collect(Collectors.toMap( Map.Entry::getKey, entry -> entry.getValue().intValue() ));
简单说,就是把每个List里的元素都替换成对应的key,然后统计每个key出现的次数——次数其实就是原List的元素个数。但这种方式多了拆分和统计的步骤,效率不如常规方案,完全没必要这么做。
内容的提问来源于stack exchange,提问作者stacktrace2234
相关产品推荐
相关产品推荐

