你可能沒聽過的 Java 8 中的 10 個特性

Blog_treasure box__

你之前聽到的談論關於Java8的全部都是圍繞lambda表達式. 但它僅僅是Java8的一部分. Java 8 有許多新特性---一些強大的新類和語法, 還有其餘的從一開始就應該具備的東西.html

我將要介紹我認爲值得了解的10個精華特性. 它們中最少也會有一個或兩個你想要試一試, 因此咱們開始吧!java

1. 默認方法api

Java語言一個新添加的特性是你能夠爲接口(interface)的方法添加方法體(稱爲默認方法). 這些方法會被隱式地添加到實現這個接口的類中.安全

這能使你在不破壞代碼的狀況下爲已存在的庫添加新功能. 這很明顯是個提高. 但另外一方面這會混淆接口與類之間的界限, 由於接口用於定義契約, 而類用於定義具體實現. 從好的方面來講, 它會以一種優雅的方式使接口更智能, 而且避免了重複和擴展庫. 但壞的方面, 咱們稍後就會看到, 接口方法要查詢this並將它轉換成具體類. Shivers….多線程

2. 進程終止併發

啓動一個外部進程是你所作的事情中的一半-當這個進程崩潰, 掛起或消耗100% CPU時你要返回來對它進行調試. 如今Process類裝備了兩個新方法來幫助你控制不守規矩的進程.oracle

第一個是 isAlive(), 它會讓你不須要等待進程運行完畢就能夠檢查這個進程是否仍在運行. 第二個更強大的方法是destroyForcibly() , 它能讓你強制殺死超時或再也不須要的進程.dom

3. StampedLocks函數

這個特性着實讓人興奮了一把。沒有人喜歡寫同步機制的代碼,固然同步機制也在必定程度上下降了你應用的吞吐量和性能,甚至可能會致使應用卡死。儘管如此,不少時候你別無選擇。工具

在多線程狀況下同時訪問一個資源時,有不少同步的語法。最經常使用的是ReadWriteLock(讀寫鎖)以及相關基於它的擴展實現。這個方法經過阻塞線程來減小多線程環境下資源的競爭。理論上聽起來不錯,但實際上鎖是很是慢的,尤爲是大量寫操做的線程中。

Java 8 引入了一種全新的稱爲StampedLock的讀寫鎖. 這個鎖不只速度更快, 它更爲樂觀鎖提供了一組強大的API, 經過它你能夠以最小的代價取得一個讀者鎖, 甚至在選擇期間不但願發生寫操做.  在選擇結束後你能夠經過查詢這個鎖來查看在選擇期間是否有寫操做, 在這種狀況下你能夠選擇是否重試, 更新鎖仍是放棄.

這個鎖是個很強大的工具, 它須要一篇專門的文章來描述. 我對這個新玩意兒興奮得頭都暈了--作得好!

更多詳情請參閱這裏

4. 併發計數器

這是讓開發多線程應用的人另外一個值得興奮的G點。一個簡潔有效的多線程讀寫計數器的new API ,在某些狀況下,它甚至比原子(AtomicIntegers)更快些!

5. Optional Values

我去,空指針!多少java開發者的噩夢。起初,或者至少1965年這個異常已經成爲最流行的異常了。

借鑑了scala和Haskell的特性,java 8增長了一個新的模板Optional 來代替方法返回null。這不意味着他就是終結null的銀彈,可是對於API設計者來講它從代碼級別(而不是文檔)代表可能傳遞給方法一個null值,這樣調用者應當提早準備好對null的處理。一樣地,這隻能應用於新的API,同時假設調用者引用的是Optional 處理後的null而不是直接引用未處理的null值 。(譯註:說白了就是使用返回Optional 對象代替返回null)

坦白的講這個特性讓我很糾結。一方面,null包含不少問題,所以我很重視在這以前作處理;另外一方面來講,我很懷疑這樣處理可否成功。Optional須要全公司不斷的努力,但它並無直接的價值。除非雷厲風行,不然它極可能會被放棄。

擴展閱讀 here.

6. 註解任何東西

另一個Java語言小改進是 annotation 如今可以添加在你代碼的 幾乎全部東西 上。之前, annotation 只能加在像類或者方法聲明上。使用 Java 8 的 annotation 能夠加在變量和參數聲明中,不只在傳遞一個值給指定類型時,甚至是分配空間給一個新的對象的時候。這是經過靜態分析和嚮導工具 (好比 FindBugs) 讓Java 語言更友好,集中精力 (沿着 Java 文檔工具和 API 改進) 的一部分 。這是個很棒的特性,可是更多的是像Java 7 引入的 invokeDynamic ,其真正的價值決定在於 社區用它來作什麼。

7. 溢出操做

如今這裏有了一系列從一開始就應該包含在覈心庫中的方法. 我最喜歡的一個習慣是調試當int超過2^32時的溢出, 而後繼續隨機地建立這個臭名昭著的bug(例如 "我是怎麼獲得這個奇怪的值的?").

此次也沒有銀彈, 但卻有一系列操做數字的函數, 這些函數當以一種比隱式引發溢出的標準的+/*操做符更不能容忍的方式發生溢出時就會拋出異常.. 若是是個人話,我會將它設爲JVM的默認模式, 使用容許算數溢出的顯式函數(而不是+ *運算符).

8. 文件夾遍歷

迭代目錄樹的內容在google搜索上很早就出現了(在這種狀況下你可能會使用Apache.FileUtils). Java 8 爲Files添加了10個新方法. 我最喜歡的是walk() ,它建立了一個懶惰流(對於大型文件系統很重要)來迭代目錄結構的內容.

9. 強隨機數生成

現今已有很多關於密碼和密鑰的脆弱性的討論. 程序安全是個棘手的問題並且很容易犯錯誤. 這也是我喜歡在JVM中可以自動挑選最強隨機數生成器的新SecureRandom.getinstanceStrong()方法的緣由. 它下降了取得生成器失敗, 或默認取得一個弱生成器從而致使密鑰或加密值容易被破解的機率.

10. Date.toInstant()

Java 8 引入一個全新的  date time API。 由於已有的api並很差,這是至關能夠理解的。如今 Joda 已經專一和深刻 Java 的 date time API 好多年。可是,就算用新的API仍有個大問題存在—— 有數以噸計的代碼和庫在使用舊的API。

咱們都知道面臨這個問題,那麼要作些什麼?

由於 Java 8 已經作得至關優雅,在Date類中添加了一個新的方法toInstant() , 用來將其轉化成爲新的API。就算使用舊的Date API (在可預見的將來也是同樣) , 也能讓你快速升級到新的API。

若是你以爲文章還有什麼該有的特性沒提到,抑或是不一樣意咱們的分析?請評論給咱們——這就是發文的目的 !

相關文章
相關標籤/搜索