首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >重构Java-8中的多个If‘语句

重构Java-8中的多个If‘语句
EN

Stack Overflow用户
提问于 2018-08-17 16:16:04
回答 7查看 6.1K关注 0票数 3

我需要验证类中的必填字段

例如,9字段不能为null

我需要检查它们是否都为空,但我现在使用了多个if语句,如下所示:

代码语言:javascript
运行
复制
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中可以利用的任何新特性?

EN

回答 7

Stack Overflow用户

发布于 2018-08-17 16:34:48

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

代码语言:javascript
运行
复制
if (!Objects.isNull(excess.getLimit()) && Objects.isNull(excess.getLimit().getId())) {
    mandatoryExcessFields.append(MANDATORY_EXCESS_FIELDS[3]);
}

将被简化为(并压缩在一行上保持可读):

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
Optional.ofNullable(excess.getStatus()).filter(s -> !StringUtils.isEmpty(s))

一种简单的方法是将这些Optional对象传递到映射中,并使用索引遍历它们并执行操作。int count是一系列检查:

代码语言:javascript
运行
复制
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也可以简化:

代码语言:javascript
运行
复制
IntStream.range(0, count).forEach(index -> 
    map.get(index)
       .ifPresent(any -> mandatoryExcessFields.append(MANDATORY_EXCESS_FIELDS[index])));
票数 3
EN

Stack Overflow用户

发布于 2018-08-17 16:19:13

基本上,这里有两种方法:

Lombok项目提供的

  • 例如
  • Java bean validation

我强烈建议研究bean验证:

将携带信息的类定义为bean。然后使用广泛的注释来标记相应的字段。然后使用一些现有的框架为您做验证。你甚至可以在那里定义你自己的注释,运行你自己的代码。

票数 2
EN

Stack Overflow用户

发布于 2018-08-17 16:20:40

您可以在excess POJO类的每个字段(或您想要的任何字段)上使用带有@NotNull注释的javax.validatorhibernate.validator。这种组合还提供了广泛的模式检查。

这样,您就不必显式地执行所有的if检查。您不仅可以使用null检查,还可以使用模式匹配检查,这可能会散布在您的代码中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51891083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档