**:jdk 1.8加入了 optional 類。用於避免用if判空時出現空指標異常,它就是乙個包裹著物件的容器。如果值存在則 ispresent()方法會返回 true,呼叫 get() 方法會返回該物件。
jdk 提供三個靜態方法來構造乙個 optional:
optional.of(t value) 該方法通過乙個非 null 的 value 來構造乙個 optional,返回的 optional 包含了 value 這個值。對於該方法,傳入的引數一定不能為 null,否則便會丟擲 nullpointerexception。
optional.ofnullable(t value) 該方法和 of 方法的區別在於,傳入的引數可以為 null,進行三目運算,判斷傳入的引數是否為 null,如果為 null 的話,返回的就是 optional.empty()。
optional.empty()該方法用來構造乙個空的 optional,即該 optional 中不包含值 —— 其實底層實現還是 如果 optional 中的 value 為 null 則該 optional 為不包含值的狀態,然後在 api 層面將 optional 表現的不能包含 null 值,使得 optional 只存在 包含值 和 不包含值 兩種狀態。
1.ifpresent
@component
@slf4j
public class kafkaconsumer )
public void listen(consumerrecord<?,?> record)",record);
log.info("--------------message= {}",message);
});}
}
如果 optional 中有值,則對該值呼叫 consumer.accept,否則什麼也不做。 所以對於上面的例子,我們可以修改為:
optionaluser = optional.ofnullable(getuserbyid(id));
user.ifpresent(u -> system.out.println("username is: " + u.getusername()));
2.orelsepublic t orelse(t other)
如果 optional 中有值則將其返回,否則返回 orelse 方法傳入的引數。
user user = optional
.ofnullable(getuserbyid(id))
.orelse(new user(0, "unknown"));
system.out.println("username is: " + user.getusername());
3.orelsegetpublic t orelseget(supplier<? extends t> ither)
orelseget 與 orelse 方法的區別在於,orelseget 方法傳入的引數為乙個 supplier 介面的實現 —— 當 optional 中有值的時候,返回值;當 optional 中沒有值的時候,返回從該 supplier 獲得的值。
user user = optional
.ofnullable(getuserbyid(id))
.orelseget(() -> new user(0, "unknown"));
system.out.println("username is: " + user.getusername());
4.orelsethrowpublic t orelsethrow(supplier<? extends x> exceptionsupplier) throws x else
}
orelsethrow 與 orelse 方法的區別在於,orelsethrow 方法當 optional 中有值的時候,返回值;沒有值的時候會丟擲異常,丟擲的異常由傳入的 exceptionsupplier 提供。
user user = optional
.ofnullable(getuserbyid(id))
.orelsethrow(() -> new entitynotfoundexception("id 為 " + id + " 的使用者沒有找到"));
舉乙個 orelsethrow 的用途:在 springmvc 的控制器中,我們可以配置統一處理各種異常。查詢某個實體時,如果資料庫中有對應的記錄便返回該記錄,否則就可以丟擲 entitynotfoundexception ,處理 entitynotfoundexception 的方法中我們就給客戶端返回http 狀態碼 404 和異常對應的資訊 —— orelsethrow 完美的適用於這種場景。
public sysuser getsysuser(@pathvariable integer id)
@exceptionhandler(entitynotfoundexception.class)
public responseentityhandleexception(entitynotfoundexception ex)
5.map
if (!ispresent()) else
}
optionalusername = optional
.ofnullable(getuserbyid(id))
.map(user -> user.getusername());
system.out.println("username is: " + username.orelse("unknown"));
而且我們可以多次使用 map 操作:
optionalusername = optional
.ofnullable(getuserbyid(id))
.map(user -> user.getusername())
.map(name -> name.tolowercase())
.map(name -> name.replace('_', ' '));
system.out.println("username is: " + username.orelse("unknown"));
6.flatmap
if (!ispresent()) else
}
optionalusername = optional
.ofnullable(getuserbyid(id))
.flatmap(user -> optional.of(user.getusername()))
.flatmap(name -> optional.of(name.tolowercase()));
system.out.println("username is: " + username.orelse("unknown"));
7.filterpublic optionalfilter(predicate<? super t> predicate) else
}
filter 方法接受乙個 predicate 來對 optional 中包含的值進行過濾,如果包含的值滿足條件,那麼還是返回這個 optional;否則返回 optional.empty。
optionalusername = optional
.ofnullable(getuserbyid(id))
.filter(user -> user.getid() < 10)
.map(user -> user.getusername());
system.out.println("username is: " + username.orelse("unknown"));
Optional類的map和flatMap的區別
1.區別 map方法接受乙個對映函式引數,返回乙個被optional包裝的結果。若結果為空,則返回空optional。flatmap方法接受乙個返回值為optional的對映函式引數,該返回值亦是flatmap方法的返回值。若結果為空,則返回空optional。2.示例 2.1 準備類 public...
10 可選型別optional 解包和繫結
當乙個值可能是不存在的時候,就需要用到可選型別 optionals optionals一種情況是值不存在,另外一種情況是他有乙個值,這個值等於某乙個x,例如 let possiblenumber 123 let convertednumber int possiblenumber 通過這個方法就直接...
如何理解Swift中Optional的 和
很多人在剛上手swift時對於optional中 和 的使用十分不理解,接下來我會談一談自己對於這兩個符號的使用方式的理解。先來說說optional的概念,以方便之後的理解。來看一下下面的 var a string nil 編譯錯誤,string型別不能為nil var b string hello...