今天继续学习kotlin发现叫做标签的这个循环流控制的用法,它很类似于某些语言的goto用法,下面我来总结一下我的理解。
首先看下面一段代码
fun foo() {
ints.forEach {
if (it == 0) return
print(it)
}
}
看代码中return关键字在代码中起到的作用就是跳出循环从而终止了循环,回到了foo方法的上下文中,如果我们只想在特定条件继续下一个训话的话要怎么写呢?如果按照原来传统写法只有一种写法,在特定条件使用continue关键字可以跳出本次循环继续下一次循环,这样是正常的,但比如说我们如果想要跳到特定的执行点要怎么写呢?在kotlin里不是难事,我们可以使用标签的用法。
例如我们需要使上面的那段代码需要只跳出本次循环进入下一个循环,当然可以,我们使用continue关键词可以搞定,但如果我们不能使用continue的情况呢,那么我们可以使用标签
例如
fun foo() {
ints.forEach @my {
if (it == 0) return@my
print(it)
}
}
标签就是这样写,@my定义了一个标签,然后使用return@my在特定条件返回我们需要执行代码处的标签继续下一次执行。
其实还存在一种比较懒惰的写法,使用默认标签
例如
fun foo() {
ints.forEach {
if (it == 0) return@forEach
print(it)
}
}
可以看到上线这段代码使用了return@forEach这样写法,同样可以实现同样的跳转,这种写法叫匿名标签。
再或者可以这么写
fun foo() {
ints.forEach(fun(value: Int) {
if (value == 0) return
print(value)
})
}
在forEach的lambda表达式替换为匿名函数,这样return只会在匿名函数返回。
以上都是我的学习总结,如果有什么问题希望大家不要喷。希望大家多提意见,纠正我的错误。
标签除了可以用continue来操作还可以在两层循环或多层循环进行跳转,使用break@标签名字跳出当前循环并跳转到对应的外层循环或代码来执行