簡體   English   中英

在 Java 8 中使用 Optional 進行多次空檢查

[英]Multiple null checks using Optional in Java 8

我想使用 Java 8 使用多個ifelse語句來簡化以下代碼段。有沒有辦法使用一些 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);

(請注意,來自ComparatorBinaryOperator的元素的靜態導入將使這一點更加清晰。)

鑒於結果只是兩種可能結果之一,您的條件是多余的:

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將獲得價值beDateaeDatenull (前兩個if語句),或者兩者都沒有nullaeDate是后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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM