今天写代码的时候突发奇想,想着是否在kotlin中有着可以想goto一样的用法的存在。
标签
首先想到的是kotlin的标签:label
class KotlinLabelCode {
/**
* 一般的方法
*/
fun FunNormal() {
println("FunNormal start")
println("here0")
for (i in 0..3) {
for (j in 0..3) {
}
println("$i")
}
println("here1")
println("FunNormal end")
}
/**
* break
* 个人理解的话这种常用的场景是在多层循环嵌套的情况下。如果需要在多条件的情况下比较推荐使用when。
*/
fun FunBreak() {
println("FunBreak start")
println("here0")
loop@for (i in 0..3) {
for (j in 0..3) {
if (j == 2) break@loop // 直接跳出两层循环体
println("here1 $i $j")
}
println("here2 $i")
}
println("here3")
println("FunBreak end")
}
/**
* 标签的cpmtinue使用
* continue 继续标签指定的循环的下一次迭代。也就是直接进行第一重循环的下一次迭代了。
*/
fun FunContinue() {
println("FunContinue start")
println("here0")
loop@for (i in 0..3) {
for (j in 0..3) {
if (j == 2) continue@loop // 直接跳出两层循环体
println("here1 $i $j")
}
println("here2 $i")
}
println("here3")
println("FunContinue end")
}
/**
* 标签的cpmtinue使用
* 这个 return 表达式从最直接包围它的函数即 foo 中返回。
* (注意,这种非局部的返回只支持传给内联函数的 lambda 表达式。)
* 如果我们需要从 lambda 表达式中返回,我们必须给它加标签并用以限制 return。
*/
fun FunReturn() {
println("FunReturn end")
var ints = 0..10
println("here0")
ints.forEach {
if (it == 3) return@forEach //这里使用了隐藏式的标签,只会从 lambda 表达式中返回.当前就相当于使用了continue
println("here1 $it")
}
println("here2")
println("FunReturn end")
}
}
fun main(args:Array<String>){
var code = KotlinLabelCode();
code.FunNormal()
code.FunBreak()
code.FunContinue()
code.FunReturn()
}
总结:kotlin中的标签和goto的差别还是很大的。虽然都是表示跳转,但是kotlin的的标签的限制更多,且只能在特定的场景中使用。如果需要使用到多种条件的场景下的话可以使用when等条件判断来使用。