JAVA8的computeIfAbsent使用方法
基础说明
computeIfAbsent
是 Java 8 引入的 Map
接口中的一个默认方法。它允许你以原子操作的方式在给定键不存在时计算其值,并将其添加到映射中。如果该键已经存在,则返回已存在的值而不执行任何计算。
下面是 computeIfAbsent
的基本用法:
Map<K, V> map = new ConcurrentHashMap<>();
V value = map.computeIfAbsent(key, k -> {
// 只有当 key 对应的 value 不存在时,这段代码才会执行。
// 计算新的 value 值,通常这里会是一个可能较耗时的操作。
return computeExpensiveValue(k);
});
在这个例子中,computeExpensiveValue(k)
方法只会在 key
不在 map
中的时候调用。如果 key
已经存在,那么它将直接返回对应的值而不会执行提供的映射函数。
用法理解
computeIfAbsent
方法特别适用于缓存场景,尤其是在需要避免重复执行资源密集型操作的情况下。当一个键不在映射中时,使用 computeIfAbsent
可以确保只计算一次值,并将其存储在映射中供后续使用,从而提高性能和效率。
为了更好地说明这一点,让我们来看一个更详细的例子,其中包含了一个模拟的资源密集型操作,比如从数据库获取数据或进行复杂的计算:
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
public class ComputeIfAbsentCacheExample {
// 模拟的缓存
private static final Map<Integer, String> cache = new ConcurrentHashMap<>();
// 模拟的资源开销大的操作,例如查询数据库
private static String expensiveDatabaseQuery(Integer id) throws InterruptedException {
System.out.println("Executing expensive operation for ID: " + id);
// 模拟延迟
TimeUnit.SECONDS.sleep(2); // 假设需要2秒来完成这个昂贵的操作
return "Data for ID: " + id;
}
public static void main(String[] args) throws InterruptedException {
Integer key = 1;
// 第一次调用 computeIfAbsent,将执行昂贵的操作
long startTime = System.currentTimeMillis();
String data = cache.computeIfAbsent(key, ComputeIfAbsentCacheExample::expensiveDatabaseQuery);
System.out.println("Data: " + data);
System.out.println("Time taken: " + (System.currentTimeMillis() - startTime) + " ms");
// 第二次调用,由于值已经在缓存中,所以不会再次执行昂贵的操作
startTime = System.currentTimeMillis();
data = cache.computeIfAbsent(key, ComputeIfAbsentCacheExample::expensiveDatabaseQuery);
System.out.println("Data: " + data);
System.out.println("Time taken: " + (System.currentTimeMillis() - startTime) + " ms");
// 查看最终的映射内容
System.out.println("Final map content: " + cache);
}
}
在这个例子中,第一次调用 computeIfAbsent
会触发 expensiveDatabaseQuery
方法的执行,这可能是一个耗时的操作(如查询数据库)。但是,一旦结果被缓存,后续对该相同键的请求将直接从缓存中返回结果,而不会再次执行昂贵的操作,这样就显著提高了性能。
JAVA8的computeIfAbsent使用方法的更多相关文章
- 乐字节-Java8新特性之方法引用
上一篇小乐介绍了<Java8新特性-函数式接口>,大家可以点击回顾.这篇文章将接着介绍Java8新特性之方法引用. Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引用 ...
- Java8中的默认方法
作者:汤圆 个人博客:javalover.cc 前言 大家好啊,我是汤圆,今天给大家带来的是<Java8中的默认方法>,希望对大家有帮助,谢谢 文章纯属原创,个人总结难免有差错,如果有,麻 ...
- Java8 Map computeIfAbsent方法说明
// 方法定义 default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) { . ...
- java8新特性-默认方法
作为一个java程序猿,经常会被问基础怎么样,对于这个问题,我理解的有两方面:一是对于java基础的理解和掌握,比如JDK的相关特性:二是工作的经历,毕竟,语言编程是一门实战性质的艺术,就算掌握了千万 ...
- java8之lambda表达式&方法引用(一)
本文将简单的介绍一下Lambda表达式和方法引用,这也是Java8的重要更新,Lambda表达式和方法引用最主要的功能是为流(专门负责迭代数据的集合)服务. 什么是lambda表达式 可以把lambd ...
- 乐字节Java8核心特性之方法引用
大家好,我是乐字节的小乐,上一次我们说到了Java8核心特性之函数式接口,接下来我们继续了解Java8又一核心特性--方法引用. Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引 ...
- java8(二)方法引用
方法引用让你可以重复使用现有的方法定义,并像 Lambda 一样进行传递. 方法引用可以被看作仅仅调用特定方法的 Lambda 的一种快捷写法. 事实上,方法引用就是让你根据已有的方法实现来创建 La ...
- java8新特性- 默认方法 在接口中有具体的实现
案例分析 在java8中在对list循环的时候,我们可以使用forEach这个方法对list进行遍历,具体代码如下demo所示 public static void main(String[] arg ...
- Java8 新特性 默认方法
默认方法为什么出现 默认方法的出现是因为在java8设计的过程中,因为加入了Lamdba表达式,和函数式接口,所以在非常多的接口里面要加入新的方法,但是如果在接口里面直接加入新的方法,那么以前写的所有 ...
- java8的interface的方法定义
转自https://www.cnblogs.com/zhenghengbin/p/9398682.html Java8新特性(一)_interface中的static方法和default方法 为什 ...
随机推荐
- 面试被问到:fiddler 在工作中有哪些应用?怎么破?
作为软件测试工程师,如果你的简历中有涉及到 fiddler 这款工具,出去面试可能会被问到:fiddler 在工作中有哪些应用? 我们都知道 fiddler 是一款非常优秀的调试代理工具,用于记录客户 ...
- Maven 使用方法
Maven Maven是一个项目管理工具,它包含了一个项目对象模型(POM:Project Object Model),其表现于一个XML文件(pom.xml),其中包含了项目的基本学习,依赖关系,插 ...
- K8S命名空间处于Terminating状态,如何强制删除
一.现象 当删除命名空间后,发现该空间一直处于Terminating状态 [root@imanager-beta-arm-21756-5g5ap ~]# kubectl get ns NAME STA ...
- Linux下执行文件删除的操作{确认!确认! 确认!再三确认!}
ubuntu 删除文件夹命令 rm -r 文件名字 ---> 强制删除XXX文件 rm -f 文件名字 ---> 强制删除XXX文件(centos) 注: linux 中, 强制删除文件的 ...
- ZRAM的Swap功能和 SWAP分区有什么区别
ZRAM(压缩内存块设备)和传统的SWAP分区都是Linux系统中用来增加可用内存的方法,但它们的工作原理和实现方式有很大的区别: ZRAM 压缩内存:ZRAM使用压缩算法将数据存储在内存中.这样,当 ...
- Java日期时间API系列14-----Jdk8中java.time包中的新的日期时间API类,java日期计算1,获取年月日时分秒等
通过Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析 ,可以看出java8设计非常好,实现接口Temporal, Tempora ...
- 什么是WebRTC
背景:webrtc web real-time communication 实时通信标准,提供了音视频通话系统的能力. 应用场景: 点对点视频聊天,如 微信视频,等实时视频通话应用. 多人视频会议,企 ...
- 08-react修改state数据驱动视图UI的更新【注意和vue的区别】
// setState 修改状态 如果是直接修改页面不会改变 使用 setState 修改数据 才会驱动视图的改变 // setState 的原理:修改玩状态之后会调用 render 函数 impor ...
- 15. Vue 数据双向绑定原理
在初始化 Vue 实例的时候,会遍历data中的数据,通过 Object.defineProperty 给数据添加 getter 和 setter 函数 ,获取数据触发 getter 函数 ,修改数据 ...
- npm install报错 SyntaxError: Unexpected end of JSON input while parsing near '...=GmVg\r\n-----END PGP'
解决方法: npm cache clean --force 然后重新执行:npm install即可