說實話,我第一次知道這個東西是從阿裡規約中,因為公司前一段時間一直在搞代碼稽核,我的代碼寫的就感覺很爛,就像規範下。讓别人看起來沒那麼爛。于是就開始看阿裡規約,在看到NPE處理的時候,上面提到用Optional類進行處理。這就是我第一次知道這個東東。
Optional簡介
- Optional 類是一個可以為null的容器對象。如果值存在則isPresent()方法會傳回true,調用get()方法會傳回該對象。
- Optional 是個容器:它可以儲存類型T的值,或者僅僅儲存null。Optional提供很多有用的方法,這樣我們就不用顯式進行空值檢測。
- Optional 類的引入很好的解決空指針異常。
Optional源碼檢視
這裡建議大家自行閱讀其完整源碼,這裡隻分析filter 和 map 方法
類的屬性和方法

從圖中我們可以看出,它的構造方法都是private修飾的。其實是一個單例模式的應用。
filter 方法
該方法是過濾方法,過濾符合條件的Optional對象,這裡的條件用Lambda表達式來定義。
public Optional<T> filter(Predicate<? super T> predicate) {
//如果入參predicate對象為null将抛NullPointerException異常
Objects.requireNonNull(predicate);
//如果Optional對象的值為null,将直接傳回該Optional對象
if (!isPresent())
return this;
//如果Optional對象的值符合限定條件(Lambda表達式來定義),傳回該值,否則傳回空的Optional對象
else
return predicate.test(value) ? this : empty();
}
map方法
map方法用于修改該值,并傳回修改後的Optional對象,一般會在多級取值的時候用到
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
//如果入參mapper對象為null将抛NullPointerException異常
Objects.requireNonNull(mapper);
//如果Optional對象的值為null,将直接傳回該Optional對象
if (!isPresent())
return empty();
//執行傳入的lambda表達式,并傳回經lambda表達式操作後的Optional對象
else {
return Optional.ofNullable(mapper.apply(value));
}
}
實戰演練
判斷不為null然後進行操作
/**
* 不為null時進行操作
*
* @param name
*/
public static void doThing(String name) {
if (name != null) {
System.out.println(name);
}
}
public static void doThingOptional(String name) {
Optional.ofNullable(name)
.ifPresent(System.out::println);
}
多層級取值
/**
* 多級取值
*
* @param user
* @return
*/
public static String getAddress(UserEntity user) {
if (user != null) {
AddressEntity addressEntity = user.getAddressEntity();
if (addressEntity != null) {
String address = addressEntity.getAddress();
if (address != null && address.length() > 3) {
return address;
}
}
}
return null;
}
public static String getAddressOptional(UserEntity user) {
return Optional.ofNullable(user)
.map(u -> u.getAddressEntity())
.map(a -> a.getAddress())
.filter(s -> s.length() > 3)
.orElse(null);
}
好了,玩的開心.
學習不是要麼0分,要麼100分的。80分是收獲;60分是收獲;20分也是收獲。有收獲最重要。但是因為着眼于自己的不完美,最終放棄了,那就是徹底的0分了。