本文介紹了對(duì)象與可選,哪個(gè)更可取?的處理方法,對(duì)大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
使用許多新方法擴(kuò)展了java.util.Objects類
Objects#requireNonNullElse
分別
Java-9
中的Objects#requireNonNullElseGet()。
如果第一個(gè)參數(shù)為非空,則兩者都將返回第一個(gè)參數(shù),否則將返回第二個(gè)非空參數(shù)或Supplier.get()的非空值
jshell> String nullStr = null;
nullStr ==> null
jshell> Objects.requireNonNullElse(nullStr,"lorem ipsum");
$13 ==> "lorem ipsum"
jshell> Objects.requireNonNullElseGet(nullStr,() -> "lorem ipsum");
$14 ==> "lorem ipsum"
但新功能與Optional
類Optional#orElse和Optional#orElseGet中已有的功能重疊
jshell> Optional.ofNullable(nullStr).orElse("lorem ipsum");
$17 ==> "lorem ipsum"
jshell> Optional.ofNullable(nullStr).orElseGet(() -> "lorem ipsum");
$18 ==> "lorem ipsum"
Objects
中的新方法與對(duì)應(yīng)的Optional
方法之間的唯一區(qū)別是供應(yīng)商的第二個(gè)參數(shù)或值必須為非空,否則Objects
拋出NPE
:
jshell> Objects.requireNonNullElseGet(nullStr,() -> null);
| java.lang.NullPointerException thrown: supplier.get()
| at Objects.requireNonNull (Objects.java:246)
| at Objects.requireNonNullElseGet (Objects.java:321)
| at (#15:1)
jshell> Objects.requireNonNullElse(nullStr,null);
| java.lang.NullPointerException thrown: defaultObj
| at Objects.requireNonNull (Objects.java:246)
| at Objects.requireNonNullElse (Objects.java:301)
| at (#16:1)
與Optional
jshell> Optional.ofNullable(nullStr).orElse(null);
$19 ==> null
jshell> Optional.ofNullable(nullStr).orElseGet(() -> null);
$20 ==> null
為什么JDK開發(fā)人員沒有更新可選中的現(xiàn)有方法
類?
他們?yōu)槭裁床灰胍粋€(gè)新的方法(它將拋出
如果第二個(gè)參數(shù)為空,則為NPE)到可選類?
現(xiàn)在我們應(yīng)該使用什么可選的或?qū)ο螅?br />
新方法是否使對(duì)象比可選方法更可取,因?yàn)樗鼈?br />
將立即拋出NPE,而不是稍后拋出代碼中的某個(gè)地方
就像可選?
如果我有遺留代碼,則如下所示:
String str = null;
String result = str == null ? "other string" : str;
這只是一個(gè)方法內(nèi)部的簡(jiǎn)單檢查。我想使用最新的語(yǔ)言功能對(duì)其進(jìn)行重新分解。現(xiàn)在,請(qǐng)注意Optional.orElse
和Objects.requireNonNullOrElse
哪個(gè)更可取?
result = Optional.ofNullable(str).orElse("other string");
或
result = Objects.requireNonNullOrElse(str,"other string);
推薦答案
您的問題”哪個(gè)更好?”是開發(fā)人員最喜歡的