今天一不心,误用这个方法,一直认为computeIfAbsent的value再次调用时,value也会随之更新,但在做单元测试时发现这个值并不是那样的,使用这个方法,map中的value只会当key不存在时,创建key,并put进value,一旦key存在,调用这个方法,还是最近一次put进的value,并非是你想要更新的结果.索性写了一个测试,去验证了一下,代码如下


 Map<String, String> map = new HashMap<>();String result = map.computeIfAbsent("test", k -> "testAbsent");System.out.println(result);result = map.computeIfAbsent("test", k -> "updateAbsent");System.out.println(result);System.out.println(map);

执行结果如下:

验证了之前的想法后,要去看map的源码实现是怎么搞的了,

default V computeIfAbsent(K key,Function<? super K, ? extends V> mappingFunction) {Objects.requireNonNull(mappingFunction);V v;if ((v = get(key)) == null) {V newValue;if ((newValue = mappingFunction.apply(key)) != null) {put(key, newValue);return newValue;}}return v;}

从源码上看,只有当get key为空时,会把新值put到map并且返回,反之返回原来的值。

总结,put只是简单的添加,当map中存在对应Key的时候,put会覆盖掉原本的value值,并返回覆盖前的value,不存在时,返回null.而computeIfAbsent顾名思义,会检查map中是否存在Key值,如果存在会检查value值是否为空,如果为空就会将K值赋给value,否则返回get到的key值。

map computeIfAbsent 的浅尝辄止相关推荐

  1. [优雅代码]-调用java集合Map.computeIfAbsent()方法

    java版本JDK1.8 Map是我们经常使用的,在面对复杂Map时,我们怎么更好的去维护呢? 这里的复杂Map就是<K,V>中V是一个Collection集合比如: 那么它是一个复杂Ma ...

  2. java.util.Map中put,computeIfAbsent与putIfAbsent区别

    computeIfAbsent和putIfAbsent区别是三点: 1.当Key存在的时候,如果Value获取比较昂贵的话,putIfAbsent就白白浪费时间在获取这个昂贵的Value上(这个点特别 ...

  3. JAVA8 Map新方法:compute,computeIfAbsent,putIfAbsent与put的区别

    本文参考自:Java8(3):Java8 中 Map 接口的新方法 不管存不存在key,都设值: 1. put put返回旧值,如果没有则返回null @Testpublic void testMap ...

  4. map赋值给另一个map_Java学习(十六): Lambda操作Map

    1. Java8新加入的lambda方法 由于继承关系,他们相应的子类也都会继承这些新方法. 2. forEach() 该方法签名为void forEach(BiConsumer super K,? ...

  5. Java8 Map中新增的方法使用总结

    前言 得益于 Java 8 的 default 方法特性,Java 8 对 Map 增加了不少实用的默认方法,像 getOrDefault, forEach, replace, replaceAll, ...

  6. th:each嵌套_难题:嵌套的computeIfAbsent

    th:each嵌套 总览 Java 8库在地图上有一个新方法,computeIfAbsent. 这是将地图转换为与键关联的对象的缓存的非常有用的方法. 但是,您可能没有考虑过一种组合. 如果您在内部调 ...

  7. 难题:嵌套computeIfAbsent

    总览 Java 8库在地图上有一个新方法,computeIfAbsent. 这是一种非常有用的将地图变成与键关联的对象的缓存的方法. 但是,您可能没有考虑过一种组合. 如果您在内部调用computeI ...

  8. 避免在ConcurrentHashMap.computeIfAbsent()中进行递归

    有时我们会提供糟糕的建议. 就像该文章中有关如何将Java 8用于缓存的功能性方法来计算斐波那契数的文章一样 . 正如我们的读者之一马蒂亚斯(Matthias)在评论中注意到的那样 ,提出的算法可能永 ...

  9. java8 Map新增方法的使用

    文章目录 文章目录 文章目录 java8 Map新增方法的使用 概述 1.compute() 1.使用 2.源码实现 2.computeIfAbsent() 1.使用 2.源码 3.computeIf ...

最新文章

  1. 计算机考古:发现世界上最古老的用户手册
  2. oracle 里面定时执行任务,比如存储过程内容等
  3. 我要做一个什么样的程序员
  4. C语言-结构体内存对齐
  5. isset、empty、var==null、is_null、var===null详细理解
  6. 【75位联合作者Nature重磅】AI药神:机器学习模型有望提前五年预测白血病!
  7. Retrofit2源码分析(一)
  8. mysql停止更新时间_我如何更新这个MySQL查询以获取从开始、停止、暂停和恢复事件经过的总时间...
  9. BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式( 二分答案 + 后缀数组 )
  10. kmeans算法中的sse_《Kmeans的K值确定》
  11. java 微博 开源_微博开源框架Motan初体验
  12. 使用WIFI通讯,手机秒变单片机大屏显示器
  13. HTML语句判断IE浏览器版本
  14. 风险预测模型评价第二弹:NRI的R语言计算
  15. python array 行向量 列向量
  16. Linux时间函数time()、ctime()、ctime_r()、localtime()、localtime_r()、asctime()、strftime()的转换关系
  17. 关于Lemur(1)
  18. java计算机毕业设计支部党建工作平台源码+mysql数据库+系统+lw文档+部署
  19. java sql编写教务系统_校园车辆管理系统的设计与实现 java+SqlServer
  20. 移讯云短信系统专业版功能介绍|客户通道选择短信平台开发

热门文章

  1. 【AI简报20210730期】黑芝麻A1000 Pro自动驾驶芯片流片成功、地平线征程 5 芯片发布...
  2. python读二进制格点雷达基数据_radar: 基于python pycinrad 以及多种类库 编写基于java 的雷达基数据统一格式读取...
  3. 软件测试 (1)软件测试基础/理论知识储备
  4. linux 下打开png文件,png文件扩展名,png文件怎么打开?
  5. 喜马拉雅下载器使用手册
  6. 运行jar文件时,ClassPathResource无法读取到资源文件的问题
  7. 宝塔 Plugin ‘InnoDB‘ registration as a STORAGE ENGINE failed 解决办法
  8. ScePT: 为规划的场景一致和基于策略轨迹预测
  9. 小程序之定位签到打卡=>腾讯地图SDK
  10. Apache基于域名、端口、IP的虚拟主机配置(Centos 6.5)