将嵌套循环转换为流



我想用流替换下面代码中的嵌套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;
}

我不确定流是否会改善这一点(至少不知道更多关于字段之间的关系)。此外,Coen.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表达式(通常的做法是为了简洁而省略类型,让类型推断完成这项工作)。

最新更新