一、概念及用法介绍在JAVA8的Map接口中,增加了一个方法computeIfAbsent。该方法的签名如下:publicVcomputeIfAbsent(Kkey,FunctionmappingFunction)HashMap、ConcurrentHashMap、HashTable等Map接口实现类继承该方法。通过这种方式,可以构建JAVA本地缓存,减少程序的计算量,程序的复杂度,使代码简洁易懂。该方法首先判断缓存MAP中是否存在指定key的值。如果不存在,会自动调用mappingFunction(key)计算出key的值,然后将key=value放入缓存Map中。Java8将使用线程安全的方法从缓存中访问记录。如果mappingFunction(key)返回的值为null或者抛出异常,则mapII中不会存储任何记录。代码示例importjava.util.HashMap;导入java.util.HashSet;导入java.util.Map;导入java.util。concurrent.ConcurrentHashMap;importjava.util.concurrent.ExecutorService;导入java.util.concurrent.Executors;importjava.util.concurrent.TimeUnit;publicclassMain{staticMapcache=newConcurrentHashMap<>();publicstaticvoidmain(String[]args)throwsInterruptedException{cache.put(0,0);缓存.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=newHashMap<>();map1.computeIfAbsent("fruits",k->genValue(k)).add("apple");map1.computeIfAbsent("fruits",k->genValue(k)).add("orange");地图1.computeIfAbsent("fruits",k->genValue(k)).add("pear");map1.computeIfAbsent("水果",k->genValue(k)).add("香蕉");map1.computeIfAbsent("fruits",k->genValue(k)).add("water");System.out.println(map1);//测试多线程序并发处理,是否同步操作Mapma??p2=newConcurrentHashMap<>();ExecutorServiceexec=Executors.newCachedThreadPool();for(inti=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);}staticHashSetgenValue(Stringstr){returnnewHashSet();}staticStringgenValue2(Stringstr){System.out.println("===");返回字符串+"2";;}/***普通的实现方式,计算量大,性能有问题。并且计算量随着n的增加呈指数增长,需要一些缓存策略,并且是线程安全的。**@paramn*@return*/staticintfibonacci(intn){如果(n==0||n==1)returnn;System.out.println("计算斐波那契("+n+")");返回斐波那契(n-2)+斐波那契(n-1);}/***利用java8的本地缓存方式,如果缓存MAP中不存在指定key的值,会自动调用mappingFunction(key)计算key的值*然后将key=value放入CacheMap,java8将使用线程安全的方式从缓存中访问记录**@paramn*@return*/staticintfibonacciJava8(intn){returncache.computeIfAbsent(n,(key)->{System.out.println("calculatingFibonacciJava8"+n);returnfibonacciJava8(n-2)+fibonacciJava8(n-1);});}/***java7中的实现*java7中,通过synchronized进行线程同步,检查缓存中是否存在key,如果不存在则计算并放入缓存中*为了更好的性能,double-需要检查锁,所以代码会比较复杂**@paramn*@return*/staticintfibonacciJava7(intn){if(n==0||n==1)returnn;Integerresult=cache.get(n);如果(结果==null){同步(缓存){结果=cache.get(n);if(result==null){System.out.println("calculatingFibonacciJava7("+n+")");结果=fibonacciJava7(n-2)+fibonacciJava7(n-1);缓存.put(n,结果);}}}返回结果;三、程序运行结果calculatingFibonacci(7)calculatingFibonacci(5)calculatingFibonacci(3)calculatingFibonacci(2)calculatingFibonacci(4)calculatingFibonacci(2)calculatingFibonacci(3)calculatingFibonacci(2)calculatingFibonacci(6)calculatingFibonacci(4)calculatingFibonacci(2))calculatingFibonacci(3)calculatingFibonacci(2)calculatingFibonacci(5)calculatingFibonacci(3)calculatingFibonacci(2)calculatingFibonacci(4)calculatingFibonacci(2)calculatingFibonacci(3)calculatingFibonacci(2)Fibonacci(7)=13calculatingFibonacciJava87calculatingFibonacciJava85calculatingFibonacciJava83calculatingFibonacciJava82calculatingFibonacciJava84calculatingFibonacciJava86FibonacciJava8(7)=13FibonacciJava7(7)=13{fruits=[orange,banana,apple,pear,water]}============{name=name2,mobile=mobile2,addr=addr2,email=email2}原文链接:https://img.ydisp.cn/news/20220914/kyinlxkbf30