我想用流替换下面代码中的嵌套for
循环:
private boolean check(St st) {
List<Co> prereqs = getCoPrereqs();
for (Co prereq : prereqs) {
List<En> stEns = st.getEns();
boolean flag = false;
for (En en : stEns) {
if (en.getCo().equals(prereq) && en.getGr() != null) {
if (en.hasPassedCo()) {
flag = true;
}
}
if (!flag)
return false;
}
}
return true;
}
两个循环和变量国旗导致混乱。我不确定这是否可以完全转换为流。
我通过以下操作简化了您的代码:
- 移除
boolean
标志。这是不必要的。 - 在preeq循环之外只获得一次
List<En>
。你可以在必要的时候重复原文。
主要区别是检查从en.hasPassedCo()
返回的false
并立即返回false
。一旦迭代完成,则返回true
。
private boolean check(St st) {
List<Co> prereqs = getCoPrereqs();
List<En> stEns = st.getEns();
for (Co prereq : prereqs) {
for (En en : stEns) {
if (en.getCo().equals(prereq) && en.getGr() != null) {
if (!en.hasPassedCo()) {
return false;
}
}
}
}
return true;
}
我不确定流是否会改善这一点(至少不知道更多关于字段之间的关系)。此外,Co
与en.getCo
的关系也没有意义。在我看来,像prereqs.contains(en.getCo())
这样的东西会更合适。
也许,你可以使用嵌套流与allMatch
。
我说"可能"因为我不能确定您所证明的代码是否符合预期,类型名称根本不是自解释的(代码中的名称非常重要)。),而且你没有在代码中附上任何解释。
如果我正确理解了你的代码,你需要验证getCoPrereqs()
返回的每个Co
对象,这需要检查每个Co
对象与En
对象,List<En>
应该从方法参数中提取。
这就是它的样子:
private boolean check(St st){
return getCoPrereqs().stream()
.allMatch((Co prereq) -> st.getEns().stream()
.allMatch((En en) -> en.getCo().equals(prereq)
&& en.getGr() != null
&& en.hasPassedCo()
));
}
出于可读性原因(为了更容易比较流和循环),我使用了显式类型的lambda表达式(通常的做法是为了简洁而省略类型,让类型推断完成这项工作)。