Java8 的 forEach() lambda 中使用 return/break/continue
在使用 lambda 表达式处理集合时,想在遍历元素达到 10 个的时候终止循环,结果发现不能使用 break
,continue
也是不可以的。然后抱着试试看的想法使用了 return
来终止发现可以的,但是行为结果却和预期的不一致。
这让我对在 lambda 中使用 return、break 以及 continue 的感到有点困惑,于是动手测试了一下,才发现在使用 Iterable.forEach()
处理集合时不能使用 break 和 continue 这两个语句,也就是说不能按照普通的 for 循环遍历集合时那样根据条件来中止遍历,而如果要实现在普通 for 循环中的效果时,可以使用 return 来达到,也就是说如果你在一个方法的 lambda 表达式中使用 return 时,这个方法是不会返回的,而只是执行下一次遍历。
测试
来看如下的测试代码:
List<String> list = Arrays.asList("123", "45634", "7892", "abch", "sdfhrthj", "mvkd");
list.stream().forEach(e -> {
if(e.length() >= 5) {
return;
}
System.out.println(e);
});
上述代码的输出结果是如下图所示:
可以看出: return
起到的作用和 continue
是相同的。
想知道这是为什么,在 Stack Overflow 中找到一个答案,主要是说 forEach()
不是一个循环,不是设计为可以用 break 以及 continue 来中止的操作。
针对问题
forEach()
循环操作元素时,是否会退出 lambda 表达式,如下图所示:
不管你遍历到哪个集合中的元素,上图都会停在第一行程序中而不会发生跳转,所以是不会停止 lambda 表达式的执行的。
即,java 函数式编程 lambda 中的 forEach()
方法,在循环遍历集合达到某一条件的时候使用 return
来中断本次操作,这和在 fori
循环中使用 continue
的效果是一样的,并不会中断整个循环操作,只是中断循环体中本次遍历的后续操作。
如果想达到使用 break
的效果,目前 lambda 是做不到的,还是老老实实的使用 fori
或者 foreach
循环吧。