[英]Multiple null checks using Optional in Java 8
我想使用 Java 8 使用多個if
和else
語句來簡化以下代碼段。有沒有辦法使用一些 Java 8 功能(例如Optional
完全擺脫它們? 我試圖在這里找到一些東西,但找不到答案。
LocalDateTime beDate = someDate;
LocalDateTime aeDate = someDate;
LocalDateTime eDate;
if (beDate == null && aeDate == null) {
eDate = null;
}
else if (beDate != null && aeDate == null) {
eDate = beDate;
}
else if (beDate == null && aeDate != null) {
eDate = aeDate;
}
else if (beDate != null && aeDate != null &&
(beDate.isEqual(aeDate) || beDate.isBefore(aeDate))) {
eDate = beDate;
}
else {
eDate = aeDate;
}
這里的邏輯很難理解。 相反,更直接地表達你的意圖:
private static final Comparator<ChronoLocalDateTime<?>> EARLIEST_PRESENT =
Comparator.nullsLast(Comparator.naturalOrder());
LocalDateTime eDate = BinaryOperator.minBy(EARLIEST_PRESENT).apply(beDate, aeDate);
(請注意,來自Comparator
和BinaryOperator
的元素的靜態導入將使這一點更加清晰。)
鑒於結果只是兩種可能結果之一,您的條件是多余的:
if (beDate == null && aeDate == null) {
eDate = null;
}
else if (beDate != null && aeDate == null) {
eDate = beDate;
}
...
在這里, eDate
將具有相同的內容beDate
在任何情況下,無論是null
或沒有。 所以if(aeDate == null) eDate = beDate;
就足夠了。 在所有其他情況下,您正在分配aeDate
,只有一個例外:
...
else if (beDate != null && aeDate != null &&
(beDate.isEqual(aeDate) || beDate.isBefore(aeDate))) {
eDate = beDate;
}
...
我們可以簡化beDate.isEqual(aeDate) || beDate.isBefore(aeDate)
beDate.isEqual(aeDate) || beDate.isBefore(aeDate)
到aeDate.isAfter(beDate)
。
所以整個語句可以寫成:
LocalDateTime eDate
= aeDate == null || (beDate != null && aeDate.isAfter(beDate))? beDate: aeDate;
||
是短路的,這意味着只有當左側評估為false
時才評估右側,因此當左側是aeDate == null
,右側暗示aeDate != null
和不需要重復。
因此, eDate
將獲得價值beDate
時aeDate
為null
(前兩個if
語句),或者兩者都沒有null
和aeDate
是后beDate
(其他引用if
語句),並獲得價值aeDate
否則。
運算符優先級使括號變得不必要,但為了清晰起見,保留它們也是有效的。
您可以使用Optional.ofNullable
,但我不建議這樣做。
將所有內容包裝在Optional
不會使其更易於閱讀。 您必須進行null
檢查,因此您將obj == null
替換為obj.isEmpty()
(或 Java 8 中的obj.isEmpty()
)。
您可以使用 Apache Commons 中的ObjectUtils::min :
LocalDateTime eDate = ObjectUtils.min(aeDate, beDate);
解決方案是一張襯墊,易於閱讀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.