Kotlin返回和跳转(配合标签)
2021-03-26 本文已影响0人
漆先生
Kotlin 有三种结构化跳转表达式:
- return。默认从最直接包围它的函数或者匿名函数返回。
- break。终⽌最直接包围它的循环。
- continue。继续下⼀次最直接包围它的循环。
一、Break 与 Continue 标签
标签限制的 break 跳转到刚好位于该标签指定的循环后⾯的执⾏点。
loop@ for (i in 1..4) {
for (j in 1..4) {
if (i == 2 && j == 2) {
break@loop
}
println("MainActivity tagAndBreak i = $i, j = $j")
}
}
输出:
System.out: MainActivity tagAndBreak i = 1, j = 1
System.out: MainActivity tagAndBreak i = 1, j = 2
System.out: MainActivity tagAndBreak i = 1, j = 3
System.out: MainActivity tagAndBreak i = 1, j = 4
System.out: MainActivity tagAndBreak i = 2, j = 1
标签限制的continue 继续标签指定的循环的下⼀次迭代。
tagsDemo@ for (i in 1..4) {
for (j in 1..4) {
if (i == 2 && j == 2) {
continue@tagsDemo
}
println("MainActivity tagAndContinue i=$i, j=$j")
}
}
输出:
System.out: MainActivity tagAndContinue i=1, j=1
System.out: MainActivity tagAndContinue i=1, j=2
System.out: MainActivity tagAndContinue i=1, j=3
System.out: MainActivity tagAndContinue i=1, j=4
System.out: MainActivity tagAndContinue i=2, j=1
System.out: MainActivity tagAndContinue i=3, j=1
System.out: MainActivity tagAndContinue i=3, j=2
System.out: MainActivity tagAndContinue i=3, j=3
System.out: MainActivity tagAndContinue i=3, j=4
System.out: MainActivity tagAndContinue i=4, j=1
System.out: MainActivity tagAndContinue i=4, j=2
System.out: MainActivity tagAndContinue i=4, j=3
System.out: MainActivity tagAndContinue i=4, j=4
二、返回到标签
//使⽤的局部返回类似于在常规循环中使⽤ continue
listOf(1, 2, 3, 4, 5).forEach lit@{
if (it == 3) return@lit // 局部返回到该 lambda 表达式的调⽤者,即 forEach 循环
println("MainActivity tagAndReturn explicit label (显示标签)$it")
}
listOf(1, 2, 3, 4, 5).forEach {
if (it == 3) return@forEach // 局部返回到该 lambda 表达式的调⽤者,即 forEach 循环
println("MainActivity tagAndReturn explicit label (隐式标签)$it")
}
listOf(1, 2, 3, 4, 5).forEach(fun(value: Int) {
if (value == 3) return // 局部返回到匿名函数的调⽤者,即 forEach 循环
println("MainActivity tagAndReturn anonymous function(匿名函数)$value")
})
//有 break 的直接等价形式
//当要返⼀个回值的时候,解析器优先选⽤标签限制的 return,即return@loop 1 意为“返回 1 到 @loop ”
run loop@{
listOf(1, 2, 3, 4, 5).forEach {
if (it == 3) return@loop // 从传⼊ run 的 lambda 表达式⾮局部返回
println("MainActivity tagAndReturn nested loop $it")
}
}
输出:
2021-03-25 13:28:40.862 20952-20952/com.kuaipi.createkotlin I/System.out: MainActivity tagAndReturn explicit label (显示标签)1
2021-03-25 13:28:40.862 20952-20952/com.kuaipi.createkotlin I/System.out: MainActivity tagAndReturn explicit label (显示标签)2
2021-03-25 13:28:40.862 20952-20952/com.kuaipi.createkotlin I/System.out: MainActivity tagAndReturn explicit label (显示标签)4
2021-03-25 13:28:40.862 20952-20952/com.kuaipi.createkotlin I/System.out: MainActivity tagAndReturn explicit label (显示标签)5
2021-03-25 13:28:40.862 20952-20952/com.kuaipi.createkotlin I/System.out: MainActivity tagAndReturn explicit label (隐式标签)1
2021-03-25 13:28:40.862 20952-20952/com.kuaipi.createkotlin I/System.out: MainActivity tagAndReturn explicit label (隐式标签)2
2021-03-25 13:28:40.862 20952-20952/com.kuaipi.createkotlin I/System.out: MainActivity tagAndReturn explicit label (隐式标签)4
2021-03-25 13:28:40.862 20952-20952/com.kuaipi.createkotlin I/System.out: MainActivity tagAndReturn explicit label (隐式标签)5
2021-03-25 13:28:40.862 20952-20952/com.kuaipi.createkotlin I/System.out: MainActivity tagAndReturn anonymous function(匿名函数)1
2021-03-25 13:28:40.862 20952-20952/com.kuaipi.createkotlin I/System.out: MainActivity tagAndReturn anonymous function(匿名函数)2
2021-03-25 13:28:40.862 20952-20952/com.kuaipi.createkotlin I/System.out: MainActivity tagAndReturn anonymous function(匿名函数)4
2021-03-25 13:28:40.862 20952-20952/com.kuaipi.createkotlin I/System.out: MainActivity tagAndReturn anonymous function(匿名函数)5
2021-03-25 13:28:40.862 20952-20952/com.kuaipi.createkotlin I/System.out: MainActivity tagAndReturn nested loop 1
2021-03-25 13:28:40.862 20952-20952/com.kuaipi.createkotlin I/System.out: MainActivity tagAndReturn nested loop 2