如何在Java 8中使用Map Put操作编写字符串迭代?

3

我想将以下代码转换为Java 8:

String s = "12345";
Map<Character,Integer> map = new HashMap<Character,Integer>();
for (int i = 0; i < s.length(); i++) {
 char c = s.charAt(i);
 if (map.containsKey(c)) {
   int cnt = map.get(c);
   map.put(c, ++cnt);
 } else {
   map.put(c, 1);
 }
}

我尝试并找到了以下迭代方式:
IntStream.rangeClosed(0, s.length).foreach(d -> {
      //all statements from char to map.put
}) ;

我不确定这是否是正确的做法。

1
或者使用带有合并函数的 toMaps.chars().mapToObj(i->(char)i).collect(Collectors.toMap(Function.identity(),v->1,Integer::sum)); - Hadi J
2
考虑继续使用循环:for(int i = 0; i < s.length(); i++) map.merge(s.charAt(i), 1, Integer::sum);。当然,您也可以使用 IntStream.range(0, s.length()) .forEach(i -> map.merge(s.charAt(i), 1, Integer::sum));。但这并不是真正的改进。 - Holger
2个回答

7
您可以这样做:
s.chars()
  .mapToObj(x -> (char) x)
  .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
  • .mapToObj(x -> (char) x) 是必需的,因为.chars()会给你一个int流,但是要使用groupingBy,你需要使用对象而不是原始类型。
  • groupingBy接收一个函数来获取分组的键和一个Collector实现。
  • Function.identity()只是返回它所传递的任何元素的函数。
  • Collectors.counting()是一个计数器。

2
请注意,这将创建一个 Map<Character,Long>。您需要使用 Collectors.summingInt(ch -> 1) 而不是 Collectors.counting() 来获取一个 Map<Character,Integer> - Holger
不错,我不知道那个方法。谢谢! - Cristian

1
你可以使用 groupingBy()counting() 收集器:
String s = "12345";

Map<Character, Long> map = s
        .chars()
        .mapToObj(i -> (char) i)
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

System.out.println(map);

很遗憾,似乎没有方便的方法可以从字符串中获取Stream<Character>,因此需要使用chars()映射到IntStream,然后使用mapToObj()将其转换为字符流。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接