在 Java-8 中重构多个 If' 语句

我需要验证我班级中的必填字段


例如,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 的任何新功能?


交互式爱情
浏览 387回答 3
3回答

开满天机

所有的都Object.isNull可能被替换为Optional对象及其方法。让我们以该行为例:if (!Objects.isNull(excess.getLimit()) && Objects.isNull(excess.getLimit().getId())) {&nbsp; &nbsp; mandatoryExcessFields.append(MANDATORY_EXCESS_FIELDS[3]);}将简化为(并压缩在 1 行上仍然可读):Optional.ofNullable(excess.getLimit())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // check the Limit&nbsp; &nbsp; &nbsp; &nbsp; .map(limit -> limit.getId())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // if not null, getId&nbsp; &nbsp; &nbsp; &nbsp; .ifPresent(i -> builder.append(MANDATORY_EXCESS_FIELDS[3]));&nbsp; // 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++) {&nbsp; &nbsp; map.get(index).ifPresent(any -> mandatoryExcessFields.append(MANDATORY_EXCESS_FIELDS[index]));}而且 for-cycle 也可以简化:IntStream.range(0, count).forEach(index ->&nbsp;&nbsp; &nbsp; map.get(index)&nbsp; &nbsp; &nbsp; &nbsp;.ifPresent(any -> mandatoryExcessFields.append(MANDATORY_EXCESS_FIELDS[index])));

冉冉说

您可以使用javax.validator,并hibernate.validator与@NotNull对每个字段(或任何字段,你想要的)你的注解excessPOJO类。这种组合还提供了广泛的模式检查。通过这种方式,您不必显式执行所有 if 检查。您不仅可以使用空检查,还可以使用模式匹配检查,这些检查可能会分散在您的代码中。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java