我有一些代码可以拆分一个字母字符串,并用它创建一个列表,然后
稍后,用字母及其频率填充Character
和Integer
的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);