Java8 的 forEach() lambda 中使用 return/break/continue

在使用 lambda 表达式处理集合时,想在遍历元素达到 10 个的时候终止循环,结果发现不能使用 breakcontinue 也是不可以的。然后抱着试试看的想法使用了 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);
});

上述代码的输出结果是如下图所示:

foreach-output.jpg

可以看出: return 起到的作用和 continue 是相同的。

想知道这是为什么,在 Stack Overflow 中找到一个答案,主要是说 forEach() 不是一个循环,不是设计为可以用 break 以及 continue 来中止的操作。

针对问题

forEach() 循环操作元素时,是否会退出 lambda 表达式,如下图所示:

foreach-test.jpg

不管你遍历到哪个集合中的元素,上图都会停在第一行程序中而不会发生跳转,所以是不会停止 lambda 表达式的执行的。

即,java 函数式编程 lambda 中的 forEach() 方法,在循环遍历集合达到某一条件的时候使用 return 来中断本次操作,这和在 fori 循环中使用 continue 的效果是一样的,并不会中断整个循环操作,只是中断循环体中本次遍历的后续操作。

如果想达到使用 break 的效果,目前 lambda 是做不到的,还是老老实实的使用 fori 或者 foreach 循环吧。

如果觉得这对你有用,请随意赞赏,给与作者支持
评论 0
最新评论