Kotlin中return@forEach无法跳出forEach循环问题咨询
Kotlin中forEach循环return@forEach无法终止循环的问题解答
你碰到的这个问题其实是对Kotlin里forEach的本质理解有偏差,咱们一步步说清楚:
首先,forEach不是传统意义上的循环,它是一个高阶函数,底层是通过遍历集合,对每个元素调用你传入的lambda表达式。而return@forEach的作用只是从当前的lambda中返回——也就是跳过当前这个元素的处理,但forEach函数会继续处理下一个元素,这就是为什么你感觉循环还是执行完毕了,哪怕去掉reversed()也没用。
至于你尝试用break@forEach报错,是因为break是专门用来终止传统循环(比如for、while)的关键字,而forEach是函数调用,不属于循环结构,编译器找不到对应的循环标签,自然会报The label '@forEach' does not denote a loop的错误。
解决办法
根据你的需求(找到第一个符合条件的元素就停止遍历,然后执行后续逻辑),有几种更合适的写法:
1. 用传统for循环(最直观)
把forEach换成普通的for循环,这样break就能正常终止整个循环了:
for (rw in rendered_words.reversed()) { if (rw.y - the_top > 0 && rw.y - the_top < height) { new_top = rw.y break } } smoothScrollTo(Math.min(text_y - height, new_top))
2. 用find函数(函数式风格,更简洁)
既然你是要找第一个满足条件的元素,直接用find高阶函数最省心——它会自动遍历集合,找到第一个符合条件的元素就停止:
val targetWord = rendered_words.reversed().find { rw -> rw.y - the_top > 0 && rw.y - the_top < height } targetWord?.let { new_top = it.y } smoothScrollTo(Math.min(text_y - height, new_top))
3. 标签式返回(不推荐,可读性差)
如果一定要保留forEach的写法,可以给外层代码块加个标签,然后用return@标签来跳出整个forEach所在的代码块,但这种写法不如前两种直观,不推荐日常使用:
run loop@ { rendered_words.reversed().forEach { rw -> if (rw.y - the_top > 0 && rw.y - the_top < height) { new_top = rw.y return@loop } } } smoothScrollTo(Math.min(text_y - height, new_top))
总的来说,推荐用前两种写法,逻辑清晰,也符合Kotlin的编码习惯。
内容的提问来源于stack exchange,提问作者AVEbrahimi
相关产品推荐
相关产品推荐

