猿问

使用 ifPresent 在 JAVA 8 中检查 NULL 安全对象

我有这个功能:


public static long toEpochMilli(OffsetDateTime dateTime) {

    return dateTime.toInstant().toEpochMilli();

}

我想使用它,但我必须先检查它是否为空


private Long buildBookingValidDate (TimeIntervalType validFor) {


        return Optional.ofNullable(validFor.getStartTimeStamp())

                .ifPresent(DateUtils::toEpochMilli);


    }

但我不知道如何返回值


holdtom
浏览 109回答 3
3回答

汪汪一只猫

这是它在“普通”Java 中的样子。只是为了比较。private Long buildBookingValidDate (TimeIntervalType validFor) {    if(validFor.getStartTimeStamp() == null)        return null;    return DateUtils.toEpochMilli(validFor.getStartTimeStamp());}

哆啦的时光机

我建议使用.mapand returnOptional<Long>而不是null当输入为 时null。使用jshell 的示例,当输入是某个值时,jshell> import java.time.OffsetDateTimejshell> 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.emptyjshell> data.map($ -> $.toInstant().toEpochMilli())$4 ==> Optional.empty

慕标5832272

您误用了Optional- 它并不是为了取代空检查而设计的。如果您仍然不想在您的情况下使用普通的旧 Java,那么您可以创建一个辅助方法,例如static&nbsp;<T,&nbsp;R>&nbsp;R&nbsp;applyIfNotNull(T&nbsp;obj,&nbsp;Function<T,&nbsp;R>&nbsp;function)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;obj&nbsp;!=&nbsp;null&nbsp;?&nbsp;function.apply(obj)&nbsp;:&nbsp;null; }并按如下方式调用它long&nbsp;time&nbsp;=&nbsp;applyIfNotNull(validFor.getStartTimeStamp(),&nbsp;FooBar::toEpochMilli);既然你这么喜欢,你可以在方法Optional中使用它:applyIfNotNullstatic&nbsp;<T,&nbsp;R>&nbsp;Optional<R>&nbsp;applyIfNotNull(T&nbsp;obj,&nbsp;Function<T,&nbsp;R>&nbsp;function)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;obj&nbsp;!=&nbsp;null&nbsp;?&nbsp;Optional.of(function.apply(obj))&nbsp;:&nbsp;Optional.empty(); }
随时随地看视频慕课网APP

相关分类

Java
我要回答