我有一些代码,它们分割一个字母串,用它制作一个List,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);
Run Code Online (Sandbox Code Playgroud)
如何用Java 8简洁地编写它?谢谢.
试试这个:
LinkedHashMap<Character, Long> counts = Pattern.compile(",")
.splitAsStream(subjects)
.collect(Collectors.groupingBy(
s -> s.charAt(0),
LinkedHashMap::new,
Collectors.counting()));
Run Code Online (Sandbox Code Playgroud)
如果你必须有一个Integer计数,你可以像这样包装计数收集器:
Collectors.collectingAndThen(Collectors.counting(), Long::intValue)
Run Code Online (Sandbox Code Playgroud)
另一种选择(感谢@Holger):
Collectors.summingInt(x -> 1)
Run Code Online (Sandbox Code Playgroud)
作为旁注,您可以使用以下代码替换循环更新:
map.merge(v, 1, Integer::sum);
Run Code Online (Sandbox Code Playgroud)