[英]Is there a better way to write using the Java 8 to populate the LinkedHashMap?
我有一些代碼可以分割一個字母串,用它制作一個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);
如何用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);
一個班輪:
Map<String, Long> frequency = Arrays.stream(input.split("(?<=.)\\W*"))
.collect(Collectors.groupingBy(s -> s, Collectors.counting()));
這會計算所有“單詞”字符(字母和數字)。
所以你正在尋找類似的東西:
Map<Character, Integer> result = new LinkedHashMap<>();
Arrays.asList(subjects.split(""))
.stream().map(s -> s.charAt(0))
.forEach(c -> result.put(c, result.containsKey(c) ? result.get(c) + 1 : 1));
而更好的解決方案是
Map<Character, Integer> result = new LinkedHashMap<>();
subjects.chars().mapToObj(c->(char)c)
.forEach(c -> result.put(c, result.containsKey(c) ? result.get(c) + 1 : 1));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.