文章目录

  • 简介
  • 爱在JDK8之前
  • JDK8中使用compute
  • JDK8中使用merge

简介

JDK是在一直在迭代更新的,很多我们熟悉的类也悄悄的添加了一些新的方法特性。比如我们最常用的HashMap。

今天给大家讲一下HashMap在JDK8中添加的两个新方法compute和merge,从而实现一行代码实现单词统计的功能。一起来看看吧。

爱在JDK8之前

JDK8为我们引入了很多非常非常有用新特性,比如Stream和lambda表达式,可以让我们的程序更加简洁。

如果我们需要统计一个数组中单词出现的次数该怎么做呢?

这里不是讲算法,所以可以直接使用HashMap:

public void countBefore8(){Map<String,Integer> wordCount=  new HashMap<>();String[] wordArray= new String[]{"we","are","the","world","we"};for(String word: wordArray){//如果存在则加1,否则将值设置为1if(wordCount.containsKey(word)) {wordCount.put(word, wordCount.get(word) + 1);}else{wordCount.put(word, 1);}}}

基本上流程是上面样子的。我们对数组进行遍历,然后判断这个单词是否存在于hashMap中,如果存在则+1。

逻辑很简单,但是看起来有些臃肿。

别怕,我们有JDK8。

JDK8中使用compute

先看下JDK8中compute的定义:

default V compute(K key,BiFunction<? super K, ? super V, ? extends V> remappingFunction) {Objects.requireNonNull(remappingFunction);V oldValue = get(key);V newValue = remappingFunction.apply(key, oldValue);if (newValue == null) {// delete mappingif (oldValue != null || containsKey(key)) {// something to removeremove(key);return null;} else {// nothing to do. Leave things as they were.return null;}} else {// add or replace old mappingput(key, newValue);return newValue;}}

可以看到compute有第二个参数BiFunction,BiFunction就是一个函数,输入两个参数,返回一个参数。

BiFunction的两个参数分别是key和key所对应的oldValue。

可考虑到我们的单词统计,我们可以直接将oldValue+1 即可。所以使用compute,可以将方法改写为:

public void countAfter8WithCompute(){Map<String,Integer> wordCount=  new HashMap<>();String[] wordArray= new String[]{"we","are","the","world","we"};Arrays.asList(wordArray).forEach(word ->{wordCount.putIfAbsent(word,0);wordCount.compute(word,(w,count)->count+1);});}

当然,我们可以将putIfAbsent放到compute中:

public void countAfter8WithCompute2(){Map<String,Integer> wordCount=  new HashMap<>();String[] wordArray= new String[]{"we","are","the","world","we"};Arrays.asList(wordArray).forEach(word -> wordCount.compute(word,(w, count)->count == null ? 1 : count + 1));}

一行代码就完成了。

JDK8中使用merge

再看看merge方法:

default V merge(K key, V value,BiFunction<? super V, ? super V, ? extends V> remappingFunction) {Objects.requireNonNull(remappingFunction);Objects.requireNonNull(value);V oldValue = get(key);V newValue = (oldValue == null) ? value :remappingFunction.apply(oldValue, value);if (newValue == null) {remove(key);} else {put(key, newValue);}return newValue;}

merge方法需要3个参数,第一个参数是key,第二个参数是key对应的oldValue为空的值,也就是为空的默认值,第三个参数是一个BiFunction参数。

不同的是BiFunction的第一个参数是oldValue,第二个参数是value。

生成newValue的逻辑是:如果oldValue不存在,则使用value。如果oldValue存在,则调用BiFunction对oldValue和Value进行合并。

我们可以写出相应的代码如下:

 public void countAfter8WithMerge(){Map<String,Integer> wordCount=  new HashMap<>();String[] wordArray= new String[]{"we","are","the","world","we"};Arrays.asList(wordArray).forEach(word->wordCount.merge(word, 1, (oldCount, one) -> oldCount + one));}

后面的函数可以用Integer::sum替代:

 public void countAfter8WithMerge(){Map<String,Integer> wordCount=  new HashMap<>();String[] wordArray= new String[]{"we","are","the","world","we"};Arrays.asList(wordArray).forEach(word->wordCount.merge(word, 1, Integer::sum));}

本文的例子https://github.com/ddean2009/learn-java-base-9-to-20/tree/master/java-base

本文已收录于 http://www.flydean.com/wordcount-in-one-line/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

巧用HashMap一行代码统计单词出现次数相关推荐

  1. java 计算i 出现的次数_JAVA算法:按照给定的段落统计单词出现次数(JAVA代码)...

    https://blog.csdn.net/seagal890/article/details/92067644 JAVA算法:按照给定的段落统计单词出现次数(JAVA代码) 写一个 JAVA程序以统 ...

  2. java统计单词出现次数_java-统计一段句子中各单词出现的次数

    问题:统计一段句子中各单词出现的次数. 思路: 1.使用split方法将文章进行分割,我们这里以空格.逗号和句点为分隔符,然后存到一个字符串数组中. 2.创建一个hashMap集合,key是字符串类型 ...

  3. 每天一个小程序—0004题(统计单词出现次数)

    第 0004 题: 任一个英文的纯文本文件,统计其中的单词出现的个数. 先给出我一开始写得,只能说非常不优美,一个一个字符搞得... 1 f = open('num.txt') 2 word = [] ...

  4. 使用Eclipse开发工具运行MapReduce统计单词出现次数

    使用Eclipse开发工具运行MapRuce统计单词出现次数 1.##我在这里将原先准备好的10000个单词的英语文章通过U盘移动到了Ubuntu系统中,也可以通过其它的方式,比如FTP传输或者将Ub ...

  5. 代码实现——MapReduce统计单词出现次数

    需求 对以下txt文档进行单词出现次数统计(txt文档在/Users/lizhengi/test/input/目录下) hadoop take spring spark hadoop hdfs map ...

  6. python统计单词出现次数最多的5个单词_【Python】统计文本中单词的出现次数前十的单词...

    代码: # 读取一个文本,并且统计文本中单词的出现次数 def read_file(): # 在windows环境中的编码问题,指定utf-8 with open('F:/python源码/实验区/0 ...

  7. python统计单词出现次数并排序_7-4 jmu-JavaPython-统计文字中的单词数量并按出现次数排序 (25分)...

    现在需要统计若干段文字(英文)中的单词数量,并且还需统计每个单词出现的次数. 注1:单词之间以空格(1个或多个空格)为间隔. 注2:忽略空行或者空格行. 基本版: 统计时,区分字母大小写,且不删除指定 ...

  8. python统计单词出现次数 青少年编程电子学会python编程等级考试二级真题解析2022年3月

    目录 python统计单词次数 一.题目要求 1.编程实现 2.输入输出 3.评分标准</

  9. python统计单词出现次数_用python统计单词出现频率

    用python的字典数据结构可以很方便地用来统计一篇文章的每个单词出现的频率.在文本相似度计算中,就经常需要用到一个单词在文章中的出现频率,进而可以根据两篇文章共有单词在相应文章中的频率比较,来计算相 ...

最新文章

  1. 【划分树+二分】HDU 4417 Super Mario
  2. linux ioctl 设备操作函数 r3到r0 应用层 驱动层 通讯
  3. 一个C/C++程序从编译到最终生成可执行文件的全过程分析
  4. Craig离开Webb了
  5. #1097 : 最小生成树一·Prim算法
  6. 【嵌入式】——对#define GPBCON (*(volatile unsigned long*)0x56000010)的理解
  7. JAVA项目怎么不是蓝色_解决IDEA创建maven项目时pom.xml没有变蓝的问题
  8. Magento 产品推荐 extension Featured products 2.0 – revamped!
  9. Linux 下的几个游戏模拟器
  10. 反射生成 INSERT 多个对象的 SQL 语句(批量插入)
  11. F-Stack KNI配置注意事项
  12. gpt-2 文章自动生成_有助于您理解GPT-3的文章
  13. ORA-01501: CREATE DATABASE failed
  14. 平面设计中的网格系统pdf_一本好书 | 排版圣经:设计中的网格系统
  15. android天气预报开题报告,开题报告-基于Android手机移动天气预报系统.doc
  16. 两年开发工作总结及未来展望
  17. Java面试题!mysql安装教程图解
  18. 使用机器学习进行语言翻译:神经网络和seq2seq为何效果非凡?
  19. bagging通过bootstrap构建集成分类器
  20. hls简述(HTTP live Streaming)

热门文章

  1. HDU4475(找规律+预处理加速)
  2. HDU3549(最大流算法的Dinic算法)
  3. TCP keepalive的详解(解惑)
  4. 长连接和Keepalive
  5. 滑动窗口算法学习(一)
  6. 除了负载均衡,Nginx还可以做很多,限流、缓存、黑白名单等
  7. LiveVideoStack成立5周年生日快乐!一路走来,感谢有你!
  8. 春天就是要搞技术啊!
  9. LiveVideoStack 主编观察 01
  10. 客观指标VS主观质量:拨开遮挡高清视频技术的迷雾