你可能沒聽過的 Java 8 中的 10 個特性
你以前聽到的談論關於Java8的所有都是圍繞lambda表示式. 但它僅僅是Java8的一部分. Java 8 有許多新特性—一些強大的新類和語法, 還有其他的從一開始就應該具有的東西.
我將要介紹我認為值得了解的10個精華特性. 它們中最少也會有一個或兩個你想要試一試, 所以我們開始吧!
1. 預設方法
Java語言一個新新增的特性是你可以為介面(interface)的方法新增方法體(稱為預設方法). 這些方法會被隱式地新增到實現這個介面的類中.
這能使你在不破壞程式碼的情況下為已存在的庫新增新功能. 這很明顯是個提升. 但另一方面這會混淆介面與類之間的界限, 因為介面用於定義契約, 而類用於定義具體實現. 從好的方面來說, 它會以一種優雅的方式使介面更智慧, 並且避免了重複和擴充套件庫. 但壞的方面, 我們稍後就會看到, 介面方法要查詢this並將它轉換成具體類. Shivers….
2. 程式終止
啟動一個外部程式是你所做的事情中的一半-當這個程式崩潰, 掛起或消耗100% CPU時你要返回來對它進行除錯. 現在Process類裝備了兩個新方法來幫助你控制不守規矩的程式.
第一個是 isAlive(), 它會讓你不需要等待程式執行完畢就可以檢查這個程式是否仍在執行. 第二個更強大的方法是destroyForcibly() , 它能讓你強制殺死超時或不再需要的程式.
3. StampedLocks
現在有一些令人激動的東西了. 沒有人喜歡同步程式碼. 它是降低你的應用的吞吐量的罪魁禍首(特別是可擴充套件的應用), 或者更嚴重–導致應用掛掉. 儘管如此,在某些時候你別無選擇.
有很多方法來限制多執行緒同步訪問臨界資源. 其中最著名的是讀寫鎖(ReadWriteLock)和與它相關的實現. 它通過允許多執行緒訪問同一資源但阻塞操作資源的執行緒來減少資源爭奪. 這聽起來在理論上很不錯, 但實際上這個鎖是相當慢的, 特別是當有大量寫執行緒時.
注: 讀寫鎖中將資源訪問者分為兩類:讀者和寫者, 讀者對資源進行只讀操作, 寫者可操作資源.
Java 8 引入了一種全新的稱為StampedLock的讀寫鎖. 這個鎖不僅速度更快, 它更為樂觀鎖提供了一組強大的API, 通過它你可以以最小的代價取得一個讀者鎖, 甚至在選擇期間不希望發生寫操作. 在選擇結束後你可以通過查詢這個鎖來檢視在選擇期間是否有寫操作, 在這種情況下你可以選擇是否重試, 更新鎖還是放棄.
這個鎖是個很強大的工具, 它需要一篇專門的文章來描述. 我對這個新玩意兒興奮得頭都暈了–做得好!
更多詳情請參閱這裡
4. Concurrent Adders
對從事多執行緒應用的人來說這是另一件小寶貝. 這是一個用於多執行緒計數器的簡單高效的新API, 它比使用AtomicInteger更快. 真他媽酷!
5. Optional Values
哦, 空指標, 所有Java開發者的噩夢. 從一開始(或最少在1965)它可能就是最流行的異常了.
借鑑自Scale和Hashell, Java 8 擁有一個新的稱為Optional的模板, 用於封裝可能為null的引用. 它絕不是終結null的銀彈, 它更是一種方式-讓API設計者從程式碼級別(而不是文件級別)表明一個null值可能會傳入一個方法或從一個方法中返回, 以讓呼叫者為null值做好準備. 因此, 這隻能在新API下工作, 並且假設呼叫者不會讓引用逃脫這個封裝從而導致不安全的解引用.
我不得不說我對這個特性很矛盾. 一方面null有很大問題, 所以我傾向於在null發生前做好所有事. 但另一方面我很懷疑它能否成功.這是因為使用Optional需要全公司不斷的努力,但它並沒有直接的價值。除非雷厲風行,否則它很可能會被放棄.
更多關於Optional請點選這裡
6. 註解任何東西
另外一個Java語言小改進是 annotations 現在能夠新增在你程式碼的 幾乎所有東西 上。以前, annotations 只能加在像類或者方法宣告上。使用 Java 8 的 annotations 可以加在變數和引數宣告中,不僅在傳遞一個值給指定型別時,甚至是分配空間給一個新的物件的時候。這是通過靜態分析和嚮導工具 (比如 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。
如果你覺得文章還有什麼該有的特性沒提到,抑或是不同意我們的分析?請評論給我們——這就是發文的目的 !
來自:oschina
相關文章
- Java 8 中你可能沒聽過的 10 個新特性Java
- 你可能沒聽過的10個網際網路技術的發明人
- 你可能沒聽過的手機輸入法技巧
- 10個Java中最沒用的特性Java
- 十個你可能沒用過的Linux命令Linux
- 你可能不知道的10個CSS3中的隱藏特性CSSS3
- Java 中你絕對沒用過的一個關鍵字?Java
- 你從未聽說過的 JavaScript 早期特性JavaScript
- 十個你可能沒用過的Linux命令(點評版)Linux
- 十個你可能沒用過的Linux命令(美化版)Linux
- 你可能沒有細究過的TCP/IPTCP
- 你可能不知道的 10 個 Laravel Eloquent 的隱藏特性Laravel
- 你可能從未聽說過這15個HTML元素方法!HTML
- 你可能沒用過的10款優秀程式碼編輯器 最喜歡哪個?
- 5種你可能從未聽說過的程式語言
- Java8的八個新特性Java
- 推薦幾個你們可能沒用過的查詢構造器的方法
- Laravel的這10個用法,你都沒用過吧!!Laravel
- 這款遊戲的月活躍玩家達到了5000萬,但你可能從來沒聽說過遊戲
- 這些Java8官方挖過的坑,你踩過幾個?Java
- 這些 JS 中強大的操作符,總有幾個你沒聽說過JS
- 【Java8新特性】關於Java8中的日期時間API,你需要掌握這些!!JavaAPI
- 可能有人聽過ThreadLocal,但一定沒人聽過ThreadLocal物件池thread物件
- 你可能沒看懂Supercell的新遊戲遊戲
- Java這個高階特性,很多人還沒用過!Java
- 8個你不可能知道的 Docker 知識Docker
- 8 個你可能不知道的 Docker 知識Docker
- 【Java 8 新特性】Java Stream 通過skip()方法跳過前N個子元素Java
- 資料探勘中易栽的10個坑,你中了沒?
- Java中的這些String特性可能需要了解下Java
- 『真香警告』這33個超級好用的CSS選擇器,你可能見都沒見過。CSS
- 你應該遠離的6個Java特性Java
- Java8的新特性Java
- 6個你可能從未使用過的Python技巧!Python
- Java 8 的重要新特性以及 Java 9、10 的發展規劃Java
- 8個Laravel模型時間戳使用技巧,你都沒用過Laravel模型時間戳
- 你可能不太會用的10個Git命令Git
- Java8中你可能不知道的一些地方之Stream實戰Java