我需要为我的 DTO 类中的 27 个字段中的每一个添加 null 和空检查,我正在寻找最有效的方法来完成它。谁能提出任何想法?
private String settingType;
private String settingCode;
private String executionEndDate;
private String startToday;
if (!ObjectUtils.isEmpty(updateRequest.getSettingType())) {
builder.setSettingType(updateRequest.getSettingType());
}
if (!ObjectUtils.isEmpty(updateRequest.getSettingCode())) {
builder.setSettingCode(updateRequest.getSettingCode());
}
if (!ObjectUtils.isEmpty(updateRequest.getExecutionEndDate())) {
builder.setExecutionEndDate(updateRequest.getExecutionEndDate());
}
if (!ObjectUtils.isEmpty(updateRequest.isStartToday())) {
builder.setStartToday(updateRequest.getStartToday());
}
我们可以使用消费者使用这个方法
import java.util.function.Consumer;
private <T> void setFieldIfNotEmpty(Consumer<T> setter, T value) {
if (ObjectUtils.isNotEmpty(value)) {
setter.accept(value);
}
}
然后同样使用上面的方法进行null和empty的检查
setFieldIfNotEmpty(builder::setSettingType, updateRequest.getSettingType());
setFieldIfNotEmpty(builder::setSettingCode, updateRequest.getSettingCode());
builder.setStartToday(updateRequest.getStartToday());
setFieldIfNotEmpty(builder::setExecutionEndDate, updateRequest.getExecutionEndDate());
像这样
一种方法是将可能返回空值的方法更改为返回可选类型,例如:
Optional<String> getSettingType() {
return Optional.ofNullable(settingType);
}
这具有自我记录的优势(它可能不返回任何值的事实现在是明确的),也意味着您可以用这样的东西替换您的代码:
updateRequest.getSettingType().ifPresent(builder::setSettingType);
updateRequest.getSettingCode().ifPresent(builder::setSettingCode);
updateRequest.getExecutionEndDate().ifPresent(builder::setExecutionEndDate);
updateRequest.getStartToday().ifPresent(builder::setStartToday);
这种方法确实意味着创建短暂的 Optional 对象,因此您需要决定它是否足够“有效”。
如果它们只是
null
支票,那么写出来可能更容易。
if (updateRequest.getSettingType() != null)
builder.setSettingType(updateRequest.getSettingType());
if (updateRequest.getSettingCode() != null)
builder.setSettingCode(updateRequest.getSettingCode());
if (updateRequest.getExecutionEndDate() != null)
builder.setExecutionEndDate(updateRequest.getExecutionEndDate());
if (updateRequest.isStartToday() != null)
builder.setStartToday(updateRequest.getStartToday());
1.) 最好在构造函数中初始化一些值,这样它就不会为任何字段获得空值。 2.) Java 8 optional 对于空值检查非常有益。