Java8如何使用Map中computeIfAbsent方法构建本地缓存
发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,这篇文章将为大家详细讲解有关Java8如何使用Map中computeIfAbsent方法构建本地缓存,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、概念及使用介绍
千家信息网最后更新 2025年02月02日Java8如何使用Map中computeIfAbsent方法构建本地缓存
这篇文章将为大家详细讲解有关Java8如何使用Map中computeIfAbsent方法构建本地缓存,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
一、概念及使用介绍
在JAVA8的Map接口中,增加了一个方法computeIfAbsent,此方法签名如下:
public V computeIfAbsent(K key, Function super K,? extends V> mappingFunction)
Map接口的实现类如HashMap,ConcurrentHashMap,HashTable等继承了此方法,通过此方法可以构建JAVA本地缓存,降低程序的计算量,程序的复杂度,使代码简洁,易懂。
此方法首先判断缓存MAP中是否存在指定key的值,如果不存在,会自动调用mappingFunction(key)计算key的value,然后将key = value放入到缓存Map,java8会使用thread-safe的方式从cache中存取记录。
如果mappingFunction(key)返回的值为null或抛出异常,则不会有记录存入map
二、代码样例
import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class Main { static Mapcache = new ConcurrentHashMap<>(); public static void main(String[] args) throws InterruptedException { cache.put(0, 0); cache.put(1, 1); // 普通方式 System.out.println("Fibonacci(7) = " + fibonacci(7)); // 采用java7的同步线程方式及java8的本地缓存的方式 System.out.println("FibonacciJava8(7) = " + fibonacciJava8(7)); System.out.println("FibonacciJava7(7) = " + fibonacciJava7(7)); // 构建多值Map样例代码 Map > map1 = new HashMap<>(); map1.computeIfAbsent("fruits", k -> genValue(k)).add("apple"); map1.computeIfAbsent("fruits", k -> genValue(k)).add("orange"); map1.computeIfAbsent("fruits", k -> genValue(k)).add("pear"); map1.computeIfAbsent("fruits", k -> genValue(k)).add("banana"); map1.computeIfAbsent("fruits", k -> genValue(k)).add("water"); System.out.println(map1); //测试多线程并发处理,是否同步操作 Map map2 = new ConcurrentHashMap<>(); ExecutorService exec = Executors.newCachedThreadPool(); for (int i = 0; i < 5; i++) { exec.execute(() -> { map2.computeIfAbsent("name", k -> genValue2(k)); map2.computeIfAbsent("addr", k -> genValue2(k)); map2.computeIfAbsent("email", k -> genValue2(k)); map2.computeIfAbsent("mobile", k -> genValue2(k)); }); } exec.shutdown(); exec.awaitTermination(1, TimeUnit.SECONDS); System.out.println(map2); } static HashSet genValue(String str) { return new HashSet (); } static String genValue2(String str) { System.out.println("==="); return str + "2"; } /** * 普通的实现方式 普通方式使用大量的计算,存在性能问题. 并且计算量随着n的增加呈指数级增加,需要用到一些缓存策略,并且是线程安全的. * * @param n * @return */ static int fibonacci(int n) { if (n == 0 || n == 1) return n; System.out.println("calculating Fibonacci(" + n + ")"); return fibonacci(n - 2) + fibonacci(n - 1); } /** * 采用java8的本地缓存方式 如果缓存MAP中不存在指定key的值,会自动调用mappingFunction(key)计算key的value * 然后将key = value放入到缓存Map,java8会使用thread-safe的方式从cache中存取记录 * * @param n * @return */ static int fibonacciJava8(int n) { return cache.computeIfAbsent(n, (key) -> { System.out.println("calculating FibonacciJava8 " + n); return fibonacciJava8(n - 2) + fibonacciJava8(n - 1); }); } /** * 在java7中的实现方式 * 在java7中,通过synchronized进行线程同步,检查缓存是否存在key对应的值,如果不存在才进行计算并放入缓存中 * 为了更好的性能,需要使用 double-checked locking,那样代码会更复杂 * * @param n * @return */ static int fibonacciJava7(int n) { if (n == 0 || n == 1) return n; Integer result = cache.get(n); if (result == null) { synchronized (cache) { result = cache.get(n); if (result == null) { System.out.println("calculating FibonacciJava7(" + n + ")"); result = fibonacciJava7(n - 2) + fibonacciJava7(n - 1); cache.put(n, result); } } } return result; } }
三、程序运行结果
calculating Fibonacci(7) calculating Fibonacci(5) calculating Fibonacci(3) calculating Fibonacci(2) calculating Fibonacci(4) calculating Fibonacci(2) calculating Fibonacci(3) calculating Fibonacci(2) calculating Fibonacci(6) calculating Fibonacci(4) calculating Fibonacci(2) calculating Fibonacci(3) calculating Fibonacci(2) calculating Fibonacci(5) calculating Fibonacci(3) calculating Fibonacci(2) calculating Fibonacci(4) calculating Fibonacci(2) calculating Fibonacci(3) calculating Fibonacci(2) Fibonacci(7) = 13 calculating FibonacciJava8 7 calculating FibonacciJava8 5 calculating FibonacciJava8 3 calculating FibonacciJava8 2 calculating FibonacciJava8 4 calculating FibonacciJava8 6 FibonacciJava8(7) = 13 FibonacciJava7(7) = 13 {fruits=[orange, banana, apple, pear, water]} === === === === {name=name2, mobile=mobile2, addr=addr2, email=email2}
关于"Java8如何使用Map中computeIfAbsent方法构建本地缓存"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
缓存
方式
代码
此方法
线程
方法
普通
程序
篇文章
同步
复杂
性能
接口
更多
存取
不错
实用
简洁
安全
内容
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
微信联不上服务器咋办
网络安全手抄报大全减笔画
利用网络技术制作微党课
消费电子和网络安全吗
锦州太阳线软件开发多少钱
服务器建在
山西oa软件开发的用途和特点
随手科技互联网金融
数据库名能改
我的世界凭租服务器可以加光影吗
关干网络安全的视频的观后感
数据库建立索引的原则和目的
大学计算机网络技术书籍
日本做软件开发
山东哪里有存储服务器客服电话
起床战争服务器1.7.2
web服务器什么用
上海施工审批管控软件开发平台
网络安全第四版课后答案
什么是石材app软件开发
河津网络安全宣传标语
宁波数字化智慧园区软件开发
共青城天气预报软件开发
软件开发规范文档
女生网络安全软件
电脑服务器终端向别的国家收费吗
通信软件开发过程价格优惠
s2200t存储服务器说明书
sql设计题数据库
网络安全 5秒内