我使用Lombok-Builder从entity对象构建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获取,并在null之上执行toZonedDateTime()
如何在没有传统方法的情况下解决这个问题(如下所述)
if (null!=rewardEntity.getLastModifiedDate(){....}
我想在使用builder-pattern设置变量时检查null,而不是在构建对象后执行null检查。有什么办法吗?
发布于 2019-04-17 00:22:50
现在所有的孩子都喜欢Optional:
Optional.ofNullable(rewardEntity.getLastModifiedDate())
.map(r -> r.toZonedDateTime())
.orElse(null) // or some other default value发布于 2019-04-16 23:46:56
rewardEntity.getLastModifiedDate() != null ? rewardEntity.getLastModifiedDate().toZonedDateTime() : null 它被称为条件运算符,这是一个三元运算符,因为它有三个操作数。
发布于 2019-04-17 00:36:23
您可以使用一个通用的实用程序方法来处理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;
}
}
}https://stackoverflow.com/questions/55712016
复制相似问题