java8避免null_在 Java 8 中避免 Null 检查
如何預防 Java 中著名的 NullPointerException 異常?這是每個 Java 初學者遲早會問到的關鍵問題之一。而且中級和高級程序員也在時時刻刻規避這個錯誤。其是迄今為止 Java 以及很多其他編程語言中最流行的一種錯誤。
Null 引用的發明者 Tony Hoare 在 2009 年道歉,并稱這種錯誤為他的十億美元錯誤。
我將其稱之為自己的十億美元錯誤。它的發明是在1965 年,那時我用一個面向對象語言(ALGOL W)設計了第一個全面的引用類型系統。我的目的是確保所有引用的使用都是絕對安全的,編譯器會自動進行檢查。但是我未能抵御住誘惑,加入了 Null 引用,僅僅是因為實現起來非常容易。它導致了數不清的錯誤、漏洞和系統崩潰,可能在之后 40 年中造成了十億美元的損失。
無論如何,我們必須要面對它。所以,我們到底能做些什么來防止 NullPointerException 異常呢?那么,答案顯然是對其添加 null 檢查。由于 null 檢查還是挺麻煩和痛苦的,很多語言為了處理 null 檢查添加了特殊的語法,即空合并運算符 —— 其在像 Groovy 或 Kotlin 這樣的語言中也被稱為 Elvis 運算符。
不幸的是 Java 沒有提供這樣的語法糖。但幸運的是這在 Java 8 中得到了改善。這篇文章介紹了如何利用像 lambda 表達式這樣的 Java 8 新特性來防止編寫不必要的 null 檢查的幾個技巧。
在 Java 8 中提高 Null 的安全性
假設我們有一個像這樣的類層次結構:
classOuter {
Nested nested;
Nested getNested() {returnnested;
}
}classNested {
Inner inner;
Inner getInner() {returninner;
}
}classInner {
String foo;
String getFoo() {returnfoo;
}
}
解決這種結構的深層嵌套路徑是有點麻煩的。我們必須編寫一堆 null 檢查來確保不會導致一個 NullPointerException:
Outer outer = newOuter();if (outer != null && outer.nested != null && outer.nested.inner != null) {
System.out.println(outer.nested.inner.foo);
}
我們可以通過利用 Java 8 的 Optional 類型來擺脫所有這些 null 檢查。map 方法接收一個 Function 類型的 lambda 表達式,并自動將每個 function 的結果包裝成一個 Optional 對象。這使我們能夠在一行中進行多個 map 操作。Null 檢查是在底層自動處理的。
Optional.of(newOuter())
.map(Outer::getNested)
.map(Nested::getInner)
.map(Inner::getFoo)
.ifPresent(System.out::println);
還有一種實現相同作用的方式就是通過利用一個 supplier 函數來解決嵌套路徑的問題:
Outer obj = newOuter();
resolve(()->obj.getNested().getInner().getFoo());
.ifPresent(System.out::println);
調用 obj.getNested().getInner().getFoo()) 可能會拋出一個 NullPointerException 異常。在這種情況下,該異常將會被捕獲,而該方法會返回 Optional.empty()。
public static Optional resolve(Supplierresolver) {try{
T result=resolver.get();returnOptional.ofNullable(result);
}catch(NullPointerException e) {returnOptional.empty();
}
}
請記住,這兩個解決方案可能沒有傳統 null 檢查那么高的性能。不過在大多數情況下不會有太大問題。
轉載:www.oschina.net/translate/avoid-null-checks-in-java
總結
以上是生活随笔為你收集整理的java8避免null_在 Java 8 中避免 Null 检查的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java的接口理解_原来Java的接口可
- 下一篇: java的源代码文件扩展名_【单选题】J