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方法 为什 ...
随机推荐
- Nuxt Kit 中的布局管理
title: Nuxt Kit 中的布局管理 date: 2024/9/18 updated: 2024/9/18 author: cmdragon excerpt: 摘要:本文详述了在Nuxt.js ...
- 利用3Dnii标签文件,生成png图片
为了便于直观的看到2D标签,通常会将其转化为png图像,具体代码如下: # coding:utf-8 from glob import glob import os import SimpleITK ...
- vue前端开发仿钉图系列(4)右侧行政区绘制的开发详解
行政区绘制是基于高德地图的api,需要在高德提供的代码基础上做好html代码在vue页面上的适配.核心功能就是选择省市区,可以根据需要绘制对应选中的地图图层.整理总结不易,如需全部代码,请联系我150 ...
- element表单校验 【登录】
async btnOK () { // 1. 表单校验 (调用表单的校验方法获取校验结果) // this.$refs.formRef.validate(function (valid) { // c ...
- k8s的pod的理解
pod共享相同的IP地址和端口空间. 这意味着在同一 pod中的容器运行的 多个进程需要注意不能绑定到相同的端口号, 否则会导致端口冲突, 但这只涉及同一pod中的容器. 由于每个pod都有独立的端口 ...
- 防火墙NAT+DHCP+ACL+ACAP
任务要求: SwitchA作为有线终端网关与DHCP Server,为无线终端与有线终端分配IP地址,并配置ACL访问控制列表控制不同用户的访问权限,客户机只能跟DMZ区域服务器互访,无线访客禁止访问 ...
- 等保测评FAQ
之前写过一篇关于等保测评的相关介绍<一起聊聊等保测评>,发现大家对于等保测评这个还是很关注的,有些人问等保测评这份工工作的,也有些人问关于等保测评一些指导意见的,这篇文章我想把大家的问题来 ...
- 基于BIO的Socket通信
基于BIO的Socket通信 告知对方命令发送完毕 关闭socket:socket.close() 关闭流:socket.shutdownOutput(),ocket.shutdownInput() ...
- ABC343:起航
ABC343:起航 2024/3/2/22:53 有点儿晚了,简单总结一下. 前4题都很基础,一点点小思维,其中C题 边界又盲目追求刚刚好,WA了一次,总结经验,程序实际设计应该略微大于数据范围. E ...
- 100GbE 网卡到底有多快?Mellanox CX455-ECAT QSFP28 100Gbps 带宽测试
地址: https://www.youtube.com/watch?v=iqQGWsH6F0I