q7goodies事例_Java 8 Friday Goodies:轻松派本地缓存
q7goodies事例
在Data Geekery ,我們喜歡Java。 而且,由于我們真的很喜歡jOOQ的流暢的API和查詢DSL ,我們對Java 8將為我們的生態系統帶來什么感到非常興奮。 我們已經寫了一些關于Java 8好東西的博客 ,現在我們覺得是時候開始一個新的博客系列了,……
Java 8星期五
每個星期五,我們都會向您展示一些不錯的教程風格的Java 8新功能,這些功能利用了lambda表達式,擴展方法和其他出色的功能。 您可以在GitHub上找到源代碼 。
Java 8 Goodie:輕松派本地緩存
現在,準備好進行本系列迄今為止最出色的啟示之一。 我們將向您展示使用良好的舊ConcurrentHashMap和lambda表達式實現本地緩存的簡便方法。 因為, Map現在有了一種新方法,可以在缺少鍵的情況下自動計算新值 。 非常適合緩存。 讓我們深入研究代碼:
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我們要做的是建立一個先前計算的斐波那契數的緩存。 最簡單的技術是記憶高速緩存中的所有值 。 這是我們建立緩存的方法:
static Map<Integer, Integer> cache = new ConcurrentHashMap<>();做完了! 如前所述,僅當我們尚無給定鍵的值時,才使用新添加的Map.computeIfAbsent()方法從source函數計算新值。 正在緩存! 而且由于保證了此方法可以原子執行,并且由于我們使用的是ConcurrentHashMap ,因此該緩存甚至是線程安全的,而無需在任何地方手動應用synchronized 。 除了計算斐波納契數之外,它還可以重用于其他東西。 但首先讓我們將此緩存應用于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我們將如何在Java 7中做到這一點?
好問題。 有很多代碼。 我們可能會使用雙重檢查鎖定來編寫這樣的內容:
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 。
結論
Lambda僅是Java 8的一部分。這是重要的一部分,但不要忘了添加到庫中的所有新功能,這些新功能現在可以與Lambda一起使用!
這真是令人興奮,并且…
我們無需使用新的庫就可以大大改善我們的代碼庫。 以上所有內容只能與JDK的庫一起運行。
在本博客系列的下周,我們將研究Java 8如何在現有和新的并發API上進行改進,敬請期待!
有關Java 8的更多信息
同時,請查看Eugen Paraschiv出色的Java 8資源頁面
翻譯自: https://www.javacodegeeks.com/2014/03/java-8-friday-goodies-easy-as-pie-local-caching.html
q7goodies事例
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的q7goodies事例_Java 8 Friday Goodies:轻松派本地缓存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ppt2019下载电脑版(ppt2020
- 下一篇: 具有PreAuthorize的Sprin