如何删除下面深层嵌套的if语句。
List<c1> list1 = new ArrayList();
}
}
答案 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);