Java 8如何将字符串转为Map<Character, Integer>?现有实现是否最优?
Java 8 实现字符串字符频次统计为Map<Character, Integer>
核心实现思路
要在Java 8中将字符串转换为Map<Character, Integer>统计字符出现次数,主要有两种主流实现方式:
方式1:使用Collectors.toMap(您提供的实现思路)
您的代码完全可行,能正确输出字符频次统计结果:
String s = "abcdaaffeebb"; var m2 = s.chars().mapToObj(i -> (char)i) .collect(Collectors.toMap((Character ch)->ch, (Character ch)->1, (oldV,newV)->oldV+newV)); System.out.println(m2);
输出:{a=3, b=3, c=1, d=1, e=2, f=2}
方式2:使用Collectors.groupingBy(更优方案)
这是更推荐的实现方式,语义更直观,代码的简洁性和灵活性更强。
对您提供的实现的分析
- 可行性:代码完全有效,能准确完成字符频次统计任务。
- 关于Lambda类型声明:您提到“Lambda中必须声明数据类型否则编译器会报错”是误解——编译器可以通过上下文自动推断参数类型,去掉显式声明后代码依然可以正常编译:
String s = "abcdaaffeebb"; var m2 = s.chars() .mapToObj(i -> (char) i) .collect(Collectors.toMap(ch -> ch, ch -> 1, (oldV, newV) -> oldV + newV)); System.out.println(m2);
- 存在的不足:
toMap的逻辑是“给每个字符初始赋值1,再合并重复键的值”,相比分组统计,语义上不够直观;另外toMap默认返回HashMap,如果需要特定Map实现(如有序的LinkedHashMap),需要额外指定构造器,灵活性不如groupingBy。
更优实现方案
方案1:返回Map<Character, Long>(默认统计类型)
Collectors.counting()会直接返回字符出现次数的Long类型统计结果,代码最简洁:
String s = "abcdaaffeebb"; Map<Character, Long> charCountMap = s.chars() .mapToObj(i -> (char) i) .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); System.out.println(charCountMap);
方案2:返回Map<Character, Integer>
如果需要Integer类型的值,可以用Collectors.summingInt直接统计:
String s = "abcdaaffeebb"; Map<Character, Integer> charCountMap = s.chars() .mapToObj(i -> (char) i) .collect(Collectors.groupingBy(Function.identity(), Collectors.summingInt(ch -> 1))); System.out.println(charCountMap);
或者通过collectingAndThen将Long结果转为Integer:
Map<Character, Integer> charCountMap = s.chars() .mapToObj(i -> (char) i) .collect(Collectors.groupingBy(Function.identity(), Collectors.collectingAndThen(Collectors.counting(), Long::intValue)));
方案3:保持插入顺序的统计结果
如果需要统计结果按照字符在原字符串中的出现顺序排列,可以指定LinkedHashMap作为Map实现:
Map<Character, Integer> charCountMap = s.chars() .mapToObj(i -> (char) i) .collect(Collectors.groupingBy(Function.identity(), LinkedHashMap::new, Collectors.summingInt(ch -> 1)));
内容的提问来源于stack exchange,提问作者curiousengineer
相关产品推荐
相关产品推荐

