在Kotlin的`forEach`中`break`和`continue`
Kotlin有非常好的迭代函数,比如forEach
或者repeat
,但是我不能让break
和continue
它们(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的旧文件 ,应该可以使用注释。 但是,它还没有实施。
自定义控件结构的中断和继续尚未实现
这个功能的问题是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 } }
您可以使用lambda表达式的返回,它根据您的使用情况模仿continue
或break
。
这在相关问题中进行了介绍: 如何在Kotlin中的功能循环中执行“中断”或“继续”?