Java可選:正確處理空值

Java 8引入了 Optional該類,以使對null的處理不那麼容易出錯。例如,以下用於選擇幸運名的程序的空檢查爲:
public static final List NAMES = Arrays.asList(“Rita”, “Gita”, “Nita”, “Ritesh”, “Nitesh”, “Ganesh”, “Yogen”, “Prateema”);
public String pickLuckyNameOldWay(final List names, final String startingLetter) {
String luckyName = null;
for (String name : names) {
if (name.startsWith(startingLetter)) {
luckyName = name;
break;
}
}
return luckyName != null ? luckyName : “No lucky name found”;
}

可以將空檢查替換爲 Optional 類方法 isPresent() ,如下所示:
public String pickLuckyNameWIsPresent(final List names, final String startingLetter) {
final Optional luckyName = names.stream().filter(name -> name.startsWith(startingLetter)).findFirst();
return luckyName.isPresent() ? luckyName.get() : “No lucky name found”;
}

但是,請注意,編寫並不比以下簡單:
return luckyName != null ? luckyName : “No lucky name found”;

在 Optional 類,但是,支持優於檢查空的其他技術。上面的代碼可以用如下orElse() 方法重寫 如下:
public String pickLuckyNameWOrElse(final List names, final String startingLetter) {
final Optional luckyName = names.stream().filter(name -> name.startsWith(startingLetter)).findFirst();
return luckyName.orElse(“No lucky name found”);
}

orElse() 在條件爲“ 如果X爲空,則填充X.返回X. ” 的情況下調用該方法 ,以便在不存在可選值的情況下可以設置默認值。
還有另一種方法稱爲 ifPresent(Function)。您可以使用此方法來調用操作並完全跳過null大小寫。例如,如果滿足以下條件,則下面的程序在這種情況下會打印一條消息:
public static void pickLuckyNameOldWay(final List names, final String startingLetter) {
String luckyName = null;
for (String name : names) {
if (name.startsWith(startingLetter)) {
luckyName = name;
break;
}
}
if (luckyName != null) {
postMessage(luckyName);
}
}
public static void postMessage(final String winnerName) {
System.out.println(String.format(“Congratulations, %s!”, winnerName));
}

可以用重寫 ifPresent() , 如下所示。以更直觀的方式,如:
public static void pickLuckyNameNewWay(final List names, final String startingLetter) {
final Optional luckyName = names.stream().filter(name -> name.startsWith(startingLetter)).findFirst();
luckyName.ifPresent(OptionalIfPresent::postMessage);
}

如果我們想在找不到名稱的情況下拋出異常,則可能是這樣的:
public String pickLuckyNameOldWay(final List names, final String startingLetter) {
String luckyName = null;
// … same code here
if (luckyName == null) {
throw new NotFoundException(“There is no name starting with letter.”);
}
return luckyName;
}

可以有意義地替換 orElseThrow 爲:
public String pickLuckyNameWOrElse(final List names, final String startingLetter) {
final Optional luckyName = names.stream().filter(name -> name.startsWith(startingLetter)).findFirst();
return luckyName.orElseThrow(() -> new NotFoundException(“There is no name starting with letter.”));
}

類中還有其他許多方法 Optional 可以null 更正確地處理 。您可以閱讀Java 8中的 Optional速查表。
最後,開發這麼多年我也總結了一套學習Java的資料與面試題,如果你在技術上面想提升自己的話,可以關注我,私信發送領取資料或者在評論區留下自己的聯繫方式,有時間記得幫我點下轉發讓跟多的人看到哦。在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章