在设置变量之前检查是否为 null - 没有 if-else

Check for null before setting the variable - without if-else

我使用 Lombok-Builderentity 对象

构建我的 api java 对象
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 获取,并在顶部执行 toZonedDateTime()null

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

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

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

rewardEntity.getLastModifiedDate() != null ? rewardEntity.getLastModifiedDate().toZonedDateTime() : null 

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

最近所有的孩子都喜欢Optional

Optional.ofNullable(rewardEntity.getLastModifiedDate())
    .map(r -> r.toZonedDateTime())
    .orElse(null) // or some other default value

你可以有一个通用的实用方法来处理像

这样的空情况
static <T, R> R transform(T obj, Function<T, R> function) {
    return obj != null ? function.apply(obj) : null;
}

并按如下方式使用

.rewardToDate(transform(rewardEntity.getRewardToDate(), OffsetDateTime::toZonedDateTime))

实际上更好的是 "override" lombok 构建器方法,因为你现在拥有的看起来更像是 placeholder/DTO 而不是构建器:

@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;
        }
    }
}