在 Map 中存储元素计数的函数式方法
Posted
技术标签:
【中文标题】在 Map 中存储元素计数的函数式方法【英文标题】:Functional approach to storing element counts in Map 【发布时间】:2021-09-10 03:55:21 【问题描述】:我遇到了一个问题,我需要计算 Iterable
中的字符串数并将总和存储在 Map
中。我想出了以下命令式解决方案:
private static Map<String, Integer> generateCounts(Iterable<String> words)
Map<String, Integer> wordCounts = new HashMap<>();
for (String word : words)
if (wordCounts.containsKey(word))
Integer count = wordCounts.get(word);
wordCounts.replace(word, count + 1);
else
wordCounts.put(word, 1);
return wordCounts;
什么是利用函数式方法而不是像上面那样的命令式方法的解决方案?
【问题讨论】:
final Map<String, Integer> wordCount = StreamSupport.stream(words.spliterator(), false).collect(Collectors.toMap(Function.identity(), word -> 1, Integer::sum));
(Ideone demo)
【参考方案1】:
如果您擅长返回Map<String, Long>
,那么您可以执行以下操作:
StreamSupport.stream(words.spliterator(), false /*sequential*/)
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
或者,不使用流,你可以这样做:
Map<String, Integer> wordCounts = new HashMap<>();
words.forEach(word -> wordCounts.merge(word, 1, Integer::sum));
return wordCounts;
这里代码中的if-else
被merge
函数替换:
if (wordCounts.containsKey(word))
Integer count = wordCounts.get(word);
wordCounts.replace(word, count + 1);
else
wordCounts.put(word, 1);
【讨论】:
以上是关于在 Map 中存储元素计数的函数式方法的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript中函数式编程的体现--map()函数和reduce()函数arr.map(pow);都使用回调函数
函数式程序设计:「10] 使用数组 slice 方法返回数组的一部分元素