成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java8使用Map中的computeIfAbsent方法構建本地緩存

開發 后端
java8在接口Map中增加了computeIfAbsent方法,可以通過此方法構建本地緩存,降低程序的計算量,程序的復雜度,使代碼簡潔,易懂。

一、概念及使用介紹

在JAVA8的Map接口中,增加了一個方法computeIfAbsent,此方法簽名如下:

  1. 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

二、代碼樣例

  1. import java.util.HashMap;  
  2. import java.util.HashSet;  
  3. import java.util.Map;  
  4. import java.util.concurrent.ConcurrentHashMap;  
  5. import java.util.concurrent.ExecutorService;  
  6. import java.util.concurrent.Executors;  
  7. import java.util.concurrent.TimeUnit;  
  8.  
  9. public class Main {  
  10.     static Map<Integer, Integer> cache = new ConcurrentHashMap<>();  
  11.  
  12.     public static void main(String[] args) throws InterruptedException {  
  13.         cache.put(00);  
  14.         cache.put(11);  
  15.         // 普通方式  
  16.         System.out.println("Fibonacci(7) = " + fibonacci(7));  
  17.         // 采用java7的同步線程方式及java8的本地緩存的方式  
  18.         System.out.println("FibonacciJava8(7) = " + fibonacciJava8(7));  
  19.         System.out.println("FibonacciJava7(7) = " + fibonacciJava7(7));  
  20.  
  21.         // 構建多值Map樣例代碼  
  22.         Map<String, HashSet<String>> map1 = new HashMap<>();  
  23.         map1.computeIfAbsent("fruits", k -> genValue(k)).add("apple");  
  24.         map1.computeIfAbsent("fruits", k -> genValue(k)).add("orange");  
  25.         map1.computeIfAbsent("fruits", k -> genValue(k)).add("pear");  
  26.         map1.computeIfAbsent("fruits", k -> genValue(k)).add("banana");  
  27.         map1.computeIfAbsent("fruits", k -> genValue(k)).add("water");  
  28.         System.out.println(map1);  
  29.  
  30.         //測試多線程并發處理,是否同步操作  
  31.         Map<String, String> map2 = new ConcurrentHashMap<>();  
  32.         ExecutorService exec = Executors.newCachedThreadPool();  
  33.         for (int i = 0; i < 5; i++) {  
  34.             exec.execute(() -> {  
  35.                 map2.computeIfAbsent("name", k -> genValue2(k));  
  36.                 map2.computeIfAbsent("addr", k -> genValue2(k));  
  37.                 map2.computeIfAbsent("email", k -> genValue2(k));  
  38.                 map2.computeIfAbsent("mobile", k -> genValue2(k));  
  39.             });  
  40.         }  
  41.         exec.shutdown();  
  42.         exec.awaitTermination(1, TimeUnit.SECONDS);  
  43.         System.out.println(map2);  
  44.     }  
  45.  
  46.     static HashSet<String> genValue(String str) {  
  47.         return new HashSet<String>();  
  48.     }  
  49.  
  50.     static String genValue2(String str) {  
  51.         System.out.println("===");  
  52.         return str + "2";  
  53.     }  
  54.  
  55.     /**  
  56.      * 普通的實現方式 普通方式使用大量的計算,存在性能問題. 并且計算量隨著n的增加呈指數級增加,需要用到一些緩存策略,并且是線程安全的.  
  57.      *   
  58.      * @param n  
  59.      * @return  
  60.      */ 
  61.     static int fibonacci(int n) {  
  62.         if (n == 0 || n == 1)  
  63.             return n;  
  64.  
  65.         System.out.println("calculating Fibonacci(" + n + ")");  
  66.         return fibonacci(n - 2) + fibonacci(n - 1);  
  67.     }  
  68.  
  69.     /**  
  70.      * 采用java8的本地緩存方式 如果緩存MAP中不存在指定key的值,會自動調用mappingFunction(key)計算key的value  
  71.      * 然后將key = value放入到緩存Map,java8會使用thread-safe的方式從cache中存取記錄  
  72.      *   
  73.      * @param n  
  74.      * @return  
  75.      */ 
  76.     static int fibonacciJava8(int n) {  
  77.         return cache.computeIfAbsent(n, (key) -> {  
  78.             System.out.println("calculating FibonacciJava8 " + n);  
  79.             return fibonacciJava8(n - 2) + fibonacciJava8(n - 1);  
  80.         });  
  81.     }  
  82.  
  83.     /**  
  84.      * 在java7中的實現方式  
  85.      * 在java7中,通過synchronized進行線程同步,檢查緩存是否存在key對應的值,如果不存在才進行計算并放入緩存中  
  86.      * 為了更好的性能,需要使用 double-checked locking,那樣代碼會更復雜  
  87.      *   
  88.      * @param n  
  89.      * @return  
  90.      */ 
  91.     static int fibonacciJava7(int n) {  
  92.         if (n == 0 || n == 1)  
  93.             return n;  
  94.  
  95.         Integer result = cache.get(n);  
  96.  
  97.         if (result == null) {  
  98.             synchronized (cache) {  
  99.                 result = cache.get(n);  
  100.  
  101.                 if (result == null) {  
  102.                     System.out.println("calculating FibonacciJava7(" + n + ")");  
  103.                     result = fibonacciJava7(n - 2) + fibonacciJava7(n - 1);  
  104.                     cache.put(n, result);  
  105.                 }  
  106.             }  
  107.         }  
  108.         return result;  
  109.     }  
  110. }  

三、程序運行結果

  1. calculating Fibonacci(7)  
  2. calculating Fibonacci(5)  
  3. calculating Fibonacci(3)  
  4. calculating Fibonacci(2)  
  5. calculating Fibonacci(4)  
  6. calculating Fibonacci(2)  
  7. calculating Fibonacci(3)  
  8. calculating Fibonacci(2)  
  9. calculating Fibonacci(6)  
  10. calculating Fibonacci(4)  
  11. calculating Fibonacci(2)  
  12. calculating Fibonacci(3)  
  13. calculating Fibonacci(2)  
  14. calculating Fibonacci(5)  
  15. calculating Fibonacci(3)  
  16. calculating Fibonacci(2)  
  17. calculating Fibonacci(4)  
  18. calculating Fibonacci(2)  
  19. calculating Fibonacci(3)  
  20. calculating Fibonacci(2)  
  21. Fibonacci(7) = 13 
  22. calculating FibonacciJava8 7 
  23. calculating FibonacciJava8 5 
  24. calculating FibonacciJava8 3 
  25. calculating FibonacciJava8 2 
  26. calculating FibonacciJava8 4 
  27. calculating FibonacciJava8 6 
  28. FibonacciJava8(7) = 13 
  29. FibonacciJava7(7) = 13 
  30. {fruits=[orange, banana, apple, pear, water]}  
  31. ===  
  32. ===  
  33. ===  
  34. ===  
  35. {name=name2, mobile=mobile2, addr=addr2, email=email2}  

 原文鏈接:http://my.oschina.net/cloudcoder/blog/217775

責任編輯:林師授 來源: oschina
相關推薦

2017-10-31 20:45:07

JavaJava8Optional

2023-05-12 07:40:01

Java8API工具

2016-11-29 12:46:24

JavaJava8時間日期庫

2022-04-14 15:12:40

Java8Stream列表

2021-03-04 08:14:37

Java8開發接口

2025-06-26 08:10:00

Java8函數

2023-01-09 11:45:21

Java8Optional系統

2014-04-10 18:00:10

Java8Java8教程

2020-07-24 08:11:04

Java8ava5語言

2012-07-18 09:45:32

Java 8ScalaLambda

2020-12-01 07:18:35

Java8日期時間

2009-01-03 14:25:10

ibmdwWeb

2015-09-30 09:34:09

java8字母序列

2020-04-27 20:55:42

JavaJava 8編程語言

2021-08-13 12:53:42

StringBuildStringJoineJava

2023-07-26 07:13:55

函數接口Java 8

2022-07-10 22:29:42

AtomicJDK項目

2024-11-07 12:33:47

2010-06-29 12:33:58

VoIP協議

2024-01-30 09:43:43

Java緩存技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕 在线观看 | 日韩一区二区三区精品 | 天天澡天天狠天天天做 | 亚洲欧美国产一区二区三区 | 国产精品小视频在线观看 | 国产亚洲精品久久午夜玫瑰园 | 日本a视频 | 久久国产成人午夜av影院武则天 | 午夜男人免费视频 | 黄色播放 | 欧美日韩中文在线观看 | 午夜三级在线观看 | 亚洲www啪成人一区二区 | 国产免费一区二区三区最新6 | 日韩三级在线观看 | 午夜影院官网 | 亚洲欧美一区在线 | 免费日韩网站 | 久久爱综合 | 亚洲国产成人在线视频 | 亚洲黄色在线免费观看 | 日韩av免费在线电影 | 最新av在线播放 | 亚洲国产aⅴ成人精品无吗 欧美激情欧美激情在线五月 | 日韩视频在线免费观看 | 国产在线观看免费 | 中日韩av| 国产精品久久久久久久岛一牛影视 | 国产精品成av人在线视午夜片 | 国产jizz女人多喷水99 | 欧美free性 | 毛片免费视频 | 伊人狠狠干 | 日韩精品专区在线影院重磅 | 成人在线精品视频 | 欧美日韩综合 | 黄色网毛片 | 精品国产一区二区在线 | 午夜精品久久久久久久久久久久久 | 亚洲成人精品 | 国产免费一区二区三区免费视频 |