Optional和ifPresent進行判空處理

2022-09-21 15:57:13 字數 3942 閱讀 4510

**:

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.orelse
public 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.orelseget
public 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.orelsethrow
public 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.filter
public 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...