为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

holdtom 2023-07-19 14:57:18
我有这个功能:public static long toEpochMilli(OffsetDateTime dateTime) {    return dateTime.toInstant().toEpochMilli();}我想使用它,但我必须先检查它是否为空private Long buildBookingValidDate (TimeIntervalType validFor) {        return Optional.ofNullable(validFor.getStartTimeStamp())                .ifPresent(DateUtils::toEpochMilli);    }但我不知道如何返回值
查看完整描述

3 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

这是它在“普通”Java 中的样子。只是为了比较。


private Long buildBookingValidDate (TimeIntervalType validFor) {

    if(validFor.getStartTimeStamp() == null)

        return null;


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

}


查看完整回答
反对 回复 2023-07-19
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

我建议使用.mapand returnOptional<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


查看完整回答
反对 回复 2023-07-19
?
慕标5832272

TA贡献1966条经验 获得超4个赞

您误用了Optional- 它并不是为了取代空检查而设计的。

如果您仍然不想在您的情况下使用普通的旧 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();
}


查看完整回答
反对 回复 2023-07-19
  • 3 回答
  • 0 关注
  • 108 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信