深度嵌套if语句删除PMD

时间:2016-10-03 12:05:05

标签: java pmd

如何删除下面深层嵌套的if语句。

List<c1> list1 = new ArrayList();

    }
}

3 个答案:

答案 0 :(得分:3)

我认为您真正的问题是您/您的应用程序是故意使用null,或者因为未初始化的变量和数组存在很多问题。

如果您追踪并消除了这些空值的来源,您可以摆脱所有使您的代码变得复杂的空检查。 (事实上​​,无论如何,我很想删除支票,并使用生成的NPE来帮助您追踪null值的来源。)

为了说明这一点,如果没有null要担心,那么这就是您的代码:

Asset listthree = (Asset) getPIFObject(aModelManager, list2);
List<c1> list1 = listthree.getCoverageList();
for (Coverage abc : list1) {
    if (("eu".equalsIgnoreCase(abc.getCoverageCd())) || 
        ("mn".equalsIgnoreCase(abc.getCoverageCd())) ) {
        myCoverage = abc;
        break;
    }
}

(我还删除了一项不必要的测试以查看list1是否为空,并移动了list1的声明。)

答案 1 :(得分:2)

将代码移动到新方法中。 for循环是一个很好的候选者。一旦它采用自己的方法,您也可以使其更简单:在找到匹配后立即返回abc

private String find(List<c1> list1) {
        for (Coverage abc :list1) {
            if(null != abc){
                if(("eu".equalsIgnoreCase(abc.getCoverageCd())) || ("mn".equalsIgnoreCase(abc.getCoverageCd())) ){
                    return abc;
                }
            }
        }
        return null;
}

然后从现有代码中调用它:

list1 = listthree.getCoverageList();
myCoverage = find(list1);

还删除了if(!list1.isEmpty()){支票 - 这是不需要的。如果列表为空,那么for循环就可以了:它不会做任何事情。

您可以做的最后一件事是确保您确实需要所有null次检查。如果这些值永远不能为null,则不要添加空检查。

答案 2 :(得分:1)

正如@StephenC所说,最好的选择是避免提供null值,以便您可以删除这些空检查。但是,如果由于某种原因您无法确定没有提供null值并且您必须保留这些空检查,则可以使用Optional重构代码:

return Optional.ofNullable(list2)
        .map(f -> getPIFObject(aModelManager, list2))
        .map(a -> a.getCoverageList().stream())
        .orElse(Stream.empty())
        .filter(c -> "eu".equalsIgnoreCase(c.getCoverageCd()) || "mn".equalsIgnoreCase(c.getCoverageCd()))
        .findFirst()
        .orElseThrow(() -> new CoverageException("No coverage found !")); //or orElse(defaultValue);

如果您是此方法的调用者,请确保永远不会传递null(而是提供空列表/默认值/ null对象),然后您的代码可以大大简化为:

Asset listthree = (Asset) getPIFObject(aModelManager, list2);
for (Coverage abc : listthree.getCoverageList()) {
    if (("eu".equalsIgnoreCase(abc.getCoverageCd())) || ("mn".equalsIgnoreCase(abc.getCoverageCd()))) {
        return abc;
    }
}
throw new CoverageException("No coverage found !"); //or return a default value

这实现了与上述相同的行为,但Optional

Asset listthree = (Asset) getPIFObject(aModelManager, list2);
return listthree.getCoverageList().stream()
        .filter(c -> "eu".equalsIgnoreCase(c.getCoverageCd()) || "mn".equalsIgnoreCase(c.getCoverageCd()))
        .findFirst()
        .orElseThrow(() -> new CoverageException("No coverage found !")); //or orElse(defaultValue);