日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 8 Friday Goodies:轻松派本地缓存

發布時間:2023/12/3 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 8 Friday Goodies:轻松派本地缓存 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在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資源頁面

參考: Java 8 Friday Goodies: JAVA,SQL和JOOQ博客上的JCG合作伙伴 Lukas Eder提供的“ 容易餅式本地緩存” 。

翻譯自: https://www.javacodegeeks.com/2014/03/java-8-friday-goodies-easy-as-pie-local-caching.html

總結

以上是生活随笔為你收集整理的Java 8 Friday Goodies:轻松派本地缓存的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。