如何在Java 8中填充Map?

3
private static Map<Character, Integer> populateMap(List<Character> chars) {
    final Map<Character, Integer> inputStringCountMap  = new HashMap<Character, Integer>();
    for (Character ch : chars) {
        int val = 0;
        if (inputStringCountMap.containsKey(ch)) {
            val = inputStringCountMap.get(ch);
        }
        inputStringCountMap.put(ch, val + 1);
    }

    return inputStringCountMap;
}

上面的函数只是用每个字符的计数填充Map。
在Java 8中是否有更短/更简洁的方法?

3
我应该指出,“populateMap”是一个糟糕的方法名称 - 它会引发“用什么来填充”的问题。 - Joe C
4个回答

11
 private static Map<Character, Long> populateMap(List<Character> chars) {

    return chars.stream()
            .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

}

5
如果您可以使用一个Map<Character, Long>,那么使用计数子收集器的分组收集器就可以实现此功能:
Map<Character, Long> result = chars.stream().collect(
    Collectors.groupingBy(Function.identity(), Collectors.counting());

如果您需要值类型为Integer,可以使用map收集器来实现:
Map<Character, Integer> result = chars.stream().collect(
    Collectors.toMap(Function.identity(), c -> 1, Integer::sum);

3
你可以尝试像这样做。
Map<Character,Integer> myFreq= new HashMap<>();
for (char ch : input.toCharArray()) {
    myFreq.put(ch, myFreq.getOrDefault(ch, 0) + 1);
}

但是,这并不涉及Java 8的概念。 - Sai Nikhil
我只是提供了一种更简洁的方法来实现问题的方式。 - Anuj Vishwakarma
OP特别询问Java 8中更简洁的方法。我想他更感兴趣的是流处理。 - Sai Nikhil

1
这是另一种方法。
for (Character ch : chars) {
    inputStringCountMap.merge(ch, 1, (a, b) -> a+b);
}

Lambda函数的参数不是(key, value),而是(oldValue, newValue)。另外,为什么要从10开始? - Joe C
是的,谢谢。我在自动模式下完成了那个操作。而且10是个打字错误。 - Norbert Bicsi
“b+1” 也很可能是不正确的,因为它总是会得到2。 - Joe C
没错。我想我需要睡一觉了。谢谢你的帮助。我现在已经修好了。 - Norbert Bicsi

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