在Kotlin的`forEach`中`break`和`continue`

Kotlin有非常好的迭代函数,比如forEach或者repeat ,但是我不能让breakcontinue它们(local和non-local):

 repeat(5) { break } (1..5).forEach { continue@forEach } 

目标是尽可能接近地使用函数式语法来模仿通常的循环。 这在Kotlin的一些老版本中是绝对有可能的,但我很难重现这个语法。

问题可能是标签(M12)的一个错误,但我认为第一个例子应该工作。

在我看来,我已经读了一些关于特殊技巧/注释的地方,但我找不到任何关于这个主题的参考。 可能看起来像下面这样:

 public inline fun repeat(times: Int, @loop body: (Int) -> Unit) { for (index in 0..times - 1) { body(index) } } 

编辑
根据Kotlin的旧文件 ,应该可以使用注释。 但是,它还没有实施。

自定义控件结构的中断和继续尚未实现

这个function的问题是3岁,所以我想这不是固定的。


原始答案
既然你提供了一个(Int) -> Unit ,你不能从中断,因为编译器不知道它在循环中被使用。

你有几个选择:

使用常规的循环:

 for (index in 0..times - 1) { // your code here } 

如果循环是方法中的最后一个代码
你可以使用return方法(如果不是unit方法,则return value )。

使用一种方法
创建一个自定义重复方法方法,返回Boolean以继续。

 public inline fun repeatUntil(times: Int, body: (Int) -> Boolean) { for (index in 0..times - 1) { if (!body(index)) break } } 

您可以使用lambdaexpression式的返回,它根据您的使用情况模仿continuebreak

这在相关问题中进行了介绍: 如何在Kotlin中的function循环中执行“中断”或“继续”?

这将打印1到5. return@forEach作用类似于Java中的关键字continue ,这意味着在这种情况下,它仍然执行每个循环,但是如果该值大于5,则跳到下一次迭代。

 fun main(args: Array) { val nums = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) nums.forEach { if (it > 5) return@forEach println(it) } } 

这将打印1到10,但跳过5。

 fun main(args: Array) { val nums = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) nums.forEach { if (it == 5) return@forEach println(it) } } 

在Kotlin游乐场试试。