說實話,我第一次知道這個東西是從阿里規約中,因為公司前一段時間一直在搞代碼審核,我的代碼寫的就感覺很爛,就像規范下。讓別人看起來沒那么爛。於是就開始看阿里規約,在看到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);
}
好了,玩的開心.
