我有一些代码可以拆分一个字母字符串,并用它创建一个列表,然后
稍后,用字母及其频率填充CharacterInteger的LinkedHashMap。代码如下

   List<String> values = Arrays.asList((subjects.split(",")));
            for (String value : values) {
                char v = value.charAt(0);
                map.put(v, map.containsKey(v) ? map.get(v) + 1 : 1);
            }
            map.put('X', 0);

如何使用Java 8简洁地编写它?谢谢。

最佳答案

试试这个:

LinkedHashMap<Character, Long> counts = Pattern.compile(",")
        .splitAsStream(subjects)
        .collect(Collectors.groupingBy(
                s -> s.charAt(0),
                LinkedHashMap::new,
                Collectors.counting()));

如果必须具有Integer计数,则可以包装计数收集器,如下所示:
Collectors.collectingAndThen(Collectors.counting(), Long::intValue)

另一个选择(感谢@Holger):
Collectors.summingInt(x -> 1)

附带说明,您可以使用以下代码替换循环更新:
map.merge(v, 1, Integer::sum);

09-27 10:35