为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

交互式爱情 2021-07-23 18:05:19
我需要验证我班级中的必填字段例如,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 的任何新功能?
查看完整描述

3 回答

?
开满天机

TA贡献1786条经验 获得超13个赞

所有的都Object.isNull可能被替换为Optional对象及其方法。让我们以该行为例:


if (!Objects.isNull(excess.getLimit()) && Objects.isNull(excess.getLimit().getId())) {

    mandatoryExcessFields.append(MANDATORY_EXCESS_FIELDS[3]);

}

将简化为(并压缩在 1 行上仍然可读):


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])));


查看完整回答
反对 回复 2021-07-29
?
冉冉说

TA贡献1877条经验 获得超1个赞

您可以使用javax.validator,并hibernate.validator@NotNull对每个字段(或任何字段,你想要的)你的注解excessPOJO类。这种组合还提供了广泛的模式检查。

通过这种方式,您不必显式执行所有 if 检查。您不仅可以使用空检查,还可以使用模式匹配检查,这些检查可能会分散在您的代码中。


查看完整回答
反对 回复 2021-07-29
  • 3 回答
  • 0 关注
  • 386 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信