首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在设置变量之前检查是否为null -不带if-else

在设置变量之前检查是否为null -不带if-else
EN

Stack Overflow用户
提问于 2019-04-16 23:44:40
回答 3查看 1.1K关注 0票数 0

我使用Lombok-Builderentity对象构建api java对象

代码语言:javascript
复制
RewardApi.builder()
                .rewardId(rewardEntity.getrewardId())
                .rewardTitle(rewardEntity.getrewardTitle())
                .rewardText(rewardEntity.getrewardText())
                .rewardFor(rewardEntity.getrewardFor())
                .rewardType(rewardEntity.getrewardType())
                .rewardFromDate(rewardEntity.getrewardFromDate().toZonedDateTime())
                .rewardToDate(rewardEntity.getrewardToDate().toZonedDateTime())
                .isDisplayOn(rewardEntity.getIsDisplayOn())
                .createdId(rewardEntity.getCreatedId())
                .updatedId(rewardEntity.getUpdatedId())
                .createdDate(rewardEntity.getCreatedDate().toZonedDateTime())
                .lastModifiedDate(rewardEntity.getLastModifiedDate().toZonedDateTime())
                .build();

我在设置lastModifiedDate字段时获取nullPointerException,因为entity对象将该字段作为null获取,并在null之上执行toZonedDateTime()

如何在没有传统方法的情况下解决这个问题(如下所述)

if (null!=rewardEntity.getLastModifiedDate(){....}

我想在使用builder-pattern设置变量时检查null,而不是在构建对象后执行null检查。有什么办法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-17 00:22:50

现在所有的孩子都喜欢Optional

代码语言:javascript
复制
Optional.ofNullable(rewardEntity.getLastModifiedDate())
    .map(r -> r.toZonedDateTime())
    .orElse(null) // or some other default value
票数 3
EN

Stack Overflow用户

发布于 2019-04-16 23:46:56

代码语言:javascript
复制
rewardEntity.getLastModifiedDate() != null ? rewardEntity.getLastModifiedDate().toZonedDateTime() : null 

它被称为条件运算符,这是一个三元运算符,因为它有三个操作数。

票数 4
EN

Stack Overflow用户

发布于 2019-04-17 00:36:23

您可以使用一个通用的实用程序方法来处理null情况,例如

代码语言:javascript
复制
static <T, R> R transform(T obj, Function<T, R> function) {
    return obj != null ? function.apply(obj) : null;
}

并按如下方式使用它

代码语言:javascript
复制
.rewardToDate(transform(rewardEntity.getRewardToDate(), OffsetDateTime::toZonedDateTime))

实际上更好的方法是“覆盖”lombok构建器方法,因为您现在拥有的更像是一个占位符/DTO,而不是构建器:

代码语言:javascript
复制
@Builder
private static class RewardApi {
    //...
    private ZonedDateTime rewardToDate;

    public static class RewardApiBuilder {

        public RewardApiBuilder rewardToDate(OffsetDateTime offsetDateTime) {
            if(offsetDateTime != null) {
                this.rewardToDate = offsetDateTime.toZonedDateTime();
            }
            return this;
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55712016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档