這里我將會給大家演示用ConcurrentHashMap類和lambda表達式實現一個本地緩存。因為Map有一個新的方法可以在key為Null的時候自動計算一個新的value值。非常完美的實現cache。來看下代碼:
public static void main(String[] args) {for (int i = 0; i < 10; i++)System.out.println("f(" + i + ") = " + fibonacci(i)); }static int fibonacci(int i) {if (i == 0)return i;if (i == 1)return 1;System.out.println("Calculating f(" + i + ")");return fibonacci(i - 2) + fibonacci(i - 1); }
當然,這種方式很傻瓜了。即使對于一個非常小的數,例如fibonacci(5),上面的代碼打印出很多行,而且都是在進行重復計算,輸出如下(只截取一部分):
Calculating f(6) Calculating f(4) Calculating f(2) Calculating f(3) Calculating f(2) Calculating f(5) Calculating f(3) Calculating f(2) Calculating f(4) Calculating f(2) Calculating f(3) Calculating f(2) f(6) = 8
我們想要做的就是創建一個緩存,用來計算斐波那契數列。最直接的方法就是在緩存中存放所有的value值。cache的創建如下:
static Map<Integer, Integer> cache = new ConcurrentHashMap<>();
(譯者注:這種寫法在Java8中是允許的)
聲明cache之后,通過Map.computeIfAbsent() 方法,可以在key所對應的value值不存在的情況下,計算一個新的value值。超高速緩存(Caching)!由于這個方法是自動執行的,而且我們使用了 ConcurrentHashMap對象,這個緩存是線程安全的,不需要手動的去寫同步方法。另外,它不僅僅可以處理斐波那契額數列,在其他地方也可以被重復使用。
不過現在,我們看看如何在fibonacci()方法中使用緩存。
static int fibonacci(int i) {if (i == 0)return i;if (i == 1)return 1;return cache.computeIfAbsent(i, (key) ->fibonacci(i - 2)+ fibonacci(i - 1)); }
瞧瞧。不能比這個再簡單了吧。想要證明嗎?好吧,每當我們計算一個新值的時候,都在控制臺輸出信息:
static int fibonacci(int i) {if (i == 0)return i;if (i == 1)return 1;return cache.computeIfAbsent(i, (key) -> {System.out.println("Slow calculation of " + key);return fibonacci(i - 2) + fibonacci(i - 1);}); }
程序輸出如下:
f(0) = 0 f(1) = 1 Slow calculation of 2 f(2) = 1 Slow calculation of 3 f(3) = 2 Slow calculation of 4 f(4) = 3 Slow calculation of 5 f(5) = 5 Slow calculation of 6 f(6) = 8 Slow calculation of 7 f(7) = 13 Slow calculation of 8 f(8) = 21 Slow calculation of 9 f(9) = 34
在Java7下又如何實現呢?
這樣代碼就會多一些,我們可以使用double-checked locking來實現:
static int fibonacciJava7(int i) {if (i == 0)return i;if (i == 1)return 1;Integer result = cache.get(i);if (result == null) {synchronized (cache) {result = cache.get(i);if (result == null) {System.out.println("Slow calculation of " + i);result = fibonacci(i - 2)+ fibonacci(i - 1);cache.put(i, result);}}}return result; }
注:你實際的解決方案很可能會用到Guava Caches。
總結:Lambdas 表達式是Java8中非常重要的一部分。我們不要忘記添加到庫中的所有的新特性。
原文鏈接: Jooq 翻譯: ImportNew.com - 宋 濤
譯文鏈接: http://www.importnew.com/10227.html
-----------------------分割線--------------------------------------------------
目前Oracle官方還未放出JDK1.8 的?Documentation ,查看API可以訪問URL:http://download.java.net/jdk8/docs/api/