我需要验证类中的必填字段
例如,9
字段不能为null
。
我需要检查它们是否都为空,但我现在使用了多个if语句,如下所示:
StringBuilder mandatoryExcessFields = new StringBuilder(MANDATORY_EXCESS_FIELDS.length);
if(Objects.isNull(excess.getAsOfDate())){
mandatoryExcessFields.append(MANDATORY_EXCESS_FIELDS[0]);
}
if(StringUtils.isEmpty(excess.getStatus())) {
mandatoryExcessFields.append(MANDATORY_EXCESS_FIELDS[1]);
}
if(Objects.isNull(excess.getLimit())) {
mandatoryExcessFields.append(MANDATORY_EXCESS_FIELDS[2]);
}
if(!Objects.isNull(excess.getLimit()) && Objects.isNull(excess.getLimit().getId())) {
mandatoryExcessFields.append(MANDATORY_EXCESS_FIELDS[3]);
}
if(!Objects.isNull(excess.getLimit()) && Objects.isNull(excess.getLimit().getAsOfDate())) {
mandatoryExcessFields.append(MANDATORY_EXCESS_FIELDS[4]);
}
if(Objects.isNull(excess.getExposure())) {
mandatoryExcessFields.append(MANDATORY_EXCESS_FIELDS[5]);
}
if(!Objects.isNull(excess.getExposure()) && Objects.isNull(excess.getExposure().getCoordinates())) {
mandatoryExcessFields.append(MANDATORY_EXCESS_FIELDS[6]);
}
if(!Objects.isNull(excess.getExposure()) && Objects.isNull(excess.getExposure().getValue())) {
mandatoryExcessFields.append(MANDATORY_EXCESS_FIELDS[7]);
}
if(StringUtils.isEmpty(excess.getLimitValue())) {
mandatoryExcessFields.append(MANDATORY_EXCESS_FIELDS[8]);
}
我们有没有更好的方法来减少这种样板代码,或者任何设计模式,或者Java-8中可以利用的任何新特性?
发布于 2018-08-17 16:34:48
所有的Object.isNull
都可以替换为Optional
对象及其方法。让我们以这行代码为例:
if (!Objects.isNull(excess.getLimit()) && Objects.isNull(excess.getLimit().getId())) {
mandatoryExcessFields.append(MANDATORY_EXCESS_FIELDS[3]);
}
将被简化为(并压缩在一行上保持可读):
Optional.ofNullable(excess.getLimit()) // check the Limit
.map(limit -> limit.getId()) // if not null, getId
.ifPresent(i -> builder.append(MANDATORY_EXCESS_FIELDS[3])); // Append if present
对于String.isEmpty(s)
检查,您必须以这种方式创建Optional
:
Optional.ofNullable(excess.getStatus()).filter(s -> !StringUtils.isEmpty(s))
一种简单的方法是将这些Optional
对象传递到映射中,并使用索引遍历它们并执行操作。int count
是一系列检查:
Map<Integer, Optional<?>> map = new HashMap<>();
map.put(...);
map.put(1, Optional.ofNullable(excess.getStatus()).filter(s -> !StringUtils.isEmpty(s)));
map.put(...);
map.put(3, Optional.ofNullable(excess.getLimit()).map(limit -> limit.getId()));
map.put(...);
for (int index=0; index<count; index++) {
map.get(index).ifPresent(any -> mandatoryExcessFields.append(MANDATORY_EXCESS_FIELDS[index]));
}
并且for-cycle也可以简化:
IntStream.range(0, count).forEach(index ->
map.get(index)
.ifPresent(any -> mandatoryExcessFields.append(MANDATORY_EXCESS_FIELDS[index])));
发布于 2018-08-17 16:19:13
基本上,这里有两种方法:
Lombok项目提供的
我强烈建议研究bean验证:
将携带信息的类定义为bean。然后使用广泛的注释来标记相应的字段。然后使用一些现有的框架为您做验证。你甚至可以在那里定义你自己的注释,运行你自己的代码。
发布于 2018-08-17 16:20:40
您可以在excess
POJO类的每个字段(或您想要的任何字段)上使用带有@NotNull
注释的javax.validator
和hibernate.validator
。这种组合还提供了广泛的模式检查。
这样,您就不必显式地执行所有的if检查。您不仅可以使用null检查,还可以使用模式匹配检查,这可能会散布在您的代码中。
https://stackoverflow.com/questions/51891083
复制相似问题