偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Java8使用Map中的computeIfAbsent方法構(gòu)建本地緩存

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

一、概念及使用介紹

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

  1. public V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction) 

Map接口的實(shí)現(xiàn)類如HashMap,ConcurrentHashMap,HashTable等繼承了此方法,通過此方法可以構(gòu)建JAVA本地緩存,降低程序的計(jì)算量,程序的復(fù)雜度,使代碼簡潔,易懂。

此方法首先判斷緩存MAP中是否存在指定key的值,如果不存在,會(huì)自動(dòng)調(diào)用mappingFunction(key)計(jì)算key的value,然后將key = value放入到緩存Map,java8會(huì)使用thread-safe的方式從cache中存取記錄。

如果mappingFunction(key)返回的值為null或拋出異常,則不會(huì)有記錄存入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.         // 構(gòu)建多值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.         //測試多線程并發(fā)處理,是否同步操作  
  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.      * 普通的實(shí)現(xiàn)方式 普通方式使用大量的計(jì)算,存在性能問題. 并且計(jì)算量隨著n的增加呈指數(shù)級增加,需要用到一些緩存策略,并且是線程安全的.  
  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的值,會(huì)自動(dòng)調(diào)用mappingFunction(key)計(jì)算key的value  
  71.      * 然后將key = value放入到緩存Map,java8會(huì)使用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中的實(shí)現(xiàn)方式  
  85.      * 在java7中,通過synchronized進(jìn)行線程同步,檢查緩存是否存在key對應(yīng)的值,如果不存在才進(jìn)行計(jì)算并放入緩存中  
  86.      * 為了更好的性能,需要使用 double-checked locking,那樣代碼會(huì)更復(fù)雜  
  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. }  

三、程序運(yùn)行結(jié)果

  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

責(zé)任編輯:林師授 來源: oschina
相關(guān)推薦

2017-10-31 20:45:07

JavaJava8Optional

2025-06-26 08:10:00

Java8函數(shù)

2021-03-04 08:14:37

Java8開發(fā)接口

2023-01-09 11:45:21

Java8Optional系統(tǒng)

2023-05-12 07:40:01

Java8API工具

2016-11-29 12:46:24

JavaJava8時(shí)間日期庫

2022-04-14 15:12:40

Java8Stream列表

2014-04-10 18:00:10

Java8Java8教程

2020-07-24 08:11:04

Java8ava5語言

2012-07-18 09:45:32

Java 8ScalaLambda

2015-09-30 09:34:09

java8字母序列

2020-04-27 20:55:42

JavaJava 8編程語言

2022-07-10 22:29:42

AtomicJDK項(xiàng)目

2009-01-03 14:25:10

ibmdwWeb

2020-12-01 07:18:35

Java8日期時(shí)間

2024-11-07 12:33:47

2021-08-13 12:53:42

StringBuildStringJoineJava

2023-07-26 07:13:55

函數(shù)接口Java 8

2024-01-30 09:43:43

Java緩存技術(shù)

2024-03-18 00:00:00

CalendaJava8Date
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號