在 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&lt;String, Integer&gt; wordCount = StreamSupport.stream(words.spliterator(), false).collect(Collectors.toMap(Function.identity(), word -&gt; 1, Integer::sum)); (Ideone demo) 【参考方案1】:

如果您擅长返回Map&lt;String, Long&gt;,那么您可以执行以下操作:

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-elsemerge 函数替换:

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 方法返回数组的一部分元素

使用高阶函数的函数式编程对集合进行操作

2021年大数据常用语言Scala(二十二):函数式编程 映射 map

(转)Python函数式编程——map()reduce()