在设置变量之前检查null-不使用if-else

时间:2019-04-16 15:44:40

标签: java java-8 lombok

我使用Lombok-Builderapi对象构建entity 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();

我在设置nullPointerException字段时得到lastModifiedDate,因为entity对象正在将该字段设为null并在{的顶部执行toZonedDateTime() {1}}

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

null

在我使用if (null!=rewardEntity.getLastModifiedDate(){....}设置变量时,我想检查null,并且在构建对象后不进行builder-pattern检查。有什么办法吗?

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

这几天所有的孩子都喜欢DeviceManagerInterface::GetAudioOutputDevices

Optional

答案 2 :(得分:1)

您可以有一个通用的实用程序方法来处理类似null的情况

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

并按以下方式使用

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

实际上更好的方法是“替代” lombok构建器方法,因为您现在拥有的似乎更像是占位符/ 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;
        }
    }
}