簡體   English   中英

使用ifPresent在JAVA 8中進行NULL安全對象檢查

[英]NULL safe object checking in JAVA 8 using ifPresent

我有這個功能:

public static long toEpochMilli(OffsetDateTime dateTime) {
    return dateTime.toInstant().toEpochMilli();
}

我要使用的但我必須先檢查它是否為空

private Long buildBookingValidDate (TimeIntervalType validFor) {

        return Optional.ofNullable(validFor.getStartTimeStamp())
                .ifPresent(DateUtils::toEpochMilli);

    }

但我不知道如何返回值

這是“普通” Java中的外觀。 只是為了比較。

private Long buildBookingValidDate (TimeIntervalType validFor) {
    if(validFor.getStartTimeStamp() == null)
        return null;

    return DateUtils.toEpochMilli(validFor.getStartTimeStamp());
}

我會建議使用.map並返回Optional<Long> ,而不是null當輸入為null

使用jshell的示例,

當輸入是某個值時

jshell> import java.time.OffsetDateTime

jshell> Optional<OffsetDateTime> data = Optional.ofNullable(OffsetDateTime.now())
data ==> Optional[2019-09-08T23:36:48.470738-07:00]

jshell> data.map($ -> $.toInstant().toEpochMilli())
$2 ==> Optional[1568011008470]

當輸入為空時,它將返回Optional.empty但客戶端必須檢查輸出中是否有值

jshell> Optional<OffsetDateTime> data = Optional.ofNullable(null)
data ==> Optional.empty

jshell> data.map($ -> $.toInstant().toEpochMilli())
$4 ==> Optional.empty

您正在濫用Optional並非旨在取代null檢查。

如果您仍然不想使用普通的舊Java,則可以創建一個輔助方法,例如

static <T, R> R applyIfNotNull(T obj, Function<T, R> function) {
    return obj != null ? function.apply(obj) : null;
}

並按如下方式調用

long time = applyIfNotNull(validFor.getStartTimeStamp(), FooBar::toEpochMilli);

並且由於您非常喜歡Optional ,因此可以在applyIfNotNull方法中使用它:

static <T, R> Optional<R> applyIfNotNull(T obj, Function<T, R> function) {
    return obj != null ? Optional.of(function.apply(obj)) : Optional.empty();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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