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

fat*_*ael 3 string lambda hashmap java-8

我试图将以下代码转换为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);
 }
}
Run Code Online (Sandbox Code Playgroud)

我尝试并发现以下迭代方式:

IntStream.rangeClosed(0, s.length).foreach(d -> {
      //all statements from char to map.put
}) ;
Run Code Online (Sandbox Code Playgroud)

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

Cri*_*ian 7

你可以这样做:

s.chars()
  .mapToObj(x -> (char) x)
  .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
Run Code Online (Sandbox Code Playgroud)
  • .mapToObj(x -> (char) x)这是必需的,因为.chars()它为您提供了一个整数流,但是要使用它,groupingBy您需要使用对象而不是基元
  • groupingBy接收一个函数以获取要分组的密钥和一个Collector实现
  • Function.identity() 只是一个函数,它返回传递给它的任何元素
  • Collectors.counting() 是一个重要的收藏家

  • 请注意,这将创建一个Map &lt;Character,Long&gt;。您将需要例如`Collectors.summingInt(ch-&gt; 1)`而不是`Collectors.counting()`来获取Map &lt;Character,Integer&gt;。 (2认同)