從 Java 8 引入的一個很有趣的特性是 Optional 類。Optional 類主要解決的問題是臭名昭著的空指針異常(NullPointerException) —— 每個 Java 程序員都非常瞭解的異常。
本質上,這是一個包含有可選值的包裝類,這意味着 Optional 類既可以含有對象也可以爲空。
Optional 是 Java 實現函數式編程的強勁一步,並且幫助在範式中實現。但是 Optional 的意義顯然不止於此。
我們從一個簡單的用例開始。在 Java 8 之前,任何訪問對象方法或屬性的調用都可能導致 NullPointerException:
String isocode = user.getAddress().getCountry().getIsocode().toUpperCase();
在這個小示例中,如果我們需要確保不觸發異常,就得在訪問每一個值之前對其進行明確地檢查:
if (user != null) {
Address address = user.getAddress();
if (address != null) {
Country country = address.getCountry();
if (country != null) {
String isocode = country.getIsocode();
if (isocode != null) {
isocode = isocode.toUpperCase();
}
}
}
}
你看到了,這很容易就變得冗長,難以維護。
爲了簡化這個過程,我們來看看用 Optional 類是怎麼做的。從創建和驗證實例,到使用其不同的方法,並與其它返回相同類型的方法相結合,下面是見證 Optional 奇蹟的時刻。
of方法
如果對象爲空就會報NullPointerException,
ofNullable方法
如果不知道對象是否爲空,就用這個方法
想要獲取對象,可以用get()方法
ifPresent方法
該方法除了執行檢查,還接受一個Consumer(消費者) 參數,如果對象不是空的,就對執行傳入的 Lambda 表達式:
ifPresentOrElse方法
在JDK1.9後改進了 Optional 類增加了 ifPresentOrElse 方法,此方法支持了if (user != null) else { // xxx}的操作
orElse方法
如果對象不爲空就直接返回,如果爲空,就返回給定值.
orElseThrow方法
如果對象爲空,則可以拋出異常
轉換值
map()方法
可以拿到對象裏面的屬性
filter方法
過濾數據,拿到和條件相等的數據