小编典典
使用return;就可以了。这不会阻止完整循环的完成。它将仅停止执行forEach循环的当前迭代。
试试下面的小程序:
public static void main(String[] args) {
ArrayList stringList = new ArrayList<>();
stringList.add("a");
stringList.add("b");
stringList.add("c");
stringList.stream().forEach(str -> {
if (str.equals("b")) return; // only skips this iteration.
System.out.println(str);
});
}
输出:
一个
ç
请注意,如何return;为b迭代执行,但是c可以在后续迭代中打印出来。
为什么这样做?
一开始该行为看起来不直观的原因是因为我们习惯于return中断整个方法的执行的语句。因此,在这种情况下,我们希望整个main方法执行都将停止。
但是,需要理解的是lambda表达式,例如:
str -> {
if (str.equals("b")) return;
System.out.println(str);
}
……确实需要被认为是它自己独特的“方法”
main,尽管它很方便地位于其中,但与方法完全分开。因此,实际上,该return语句仅停止执行lambda表达式。
需要理解的第二件事是:
stringList.stream().forEach()
…实际上只是一个普通的循环,它在每次迭代时都执行lambda表达式。
考虑到这两点,可以按照以下等效方式(仅用于教育目的)重写以上代码:
public static void main(String[] args) {
ArrayList stringList = new ArrayList<>();
stringList.add("a");
stringList.add("b");
stringList.add("c");
for(String s : stringList) {
lambdaExpressionEquivalent(s);
}
}
private static void lambdaExpressionEquivalent(String str) {
if (str.equals("b")) {
return;
}
System.out.println(str);
}
有了等效的“少魔术”代码,该return语句的范围就变得更加明显。
2020-09-24