基础之标签
Kotlin中标签的含义和Java中的基本一致,都是为了方便跳转到指定位置,常和 break 和 continue 搭配使用。但是Kotlin中的标签还可以和 return 搭配使用,表示在标签处返回。
使用
声明: 标签名@ 例:hello@
使用: @标签名 例:@hello
实战
- 结合 break
- 结合 continue
- 结合 return
结合 break
初始代码:
fun main(args: Array<String>) {
for (i in 1..4) {
for (j in 1..4) {
if (i == 2 && j == 2) {
break
}
println("i = $i, j = $j")
}
}
}
输出结果:
i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 1, j = 4
i = 2, j = 1
i = 3, j = 1
i = 3, j = 2
i = 3, j = 3
i = 3, j = 4
i = 4, j = 1
i = 4, j = 2
i = 4, j = 3
i = 4, j = 4
开始实战:
如果想让 i=2,j=2 时直接跳出外层循环,就可以使用标签,代码如下break@tagName
:
// 修改代码
fun main(args: Array<String>) {
loop@ for (i in 1..4) {
for (j in 1..4) {
if (i == 2 && j == 2) {
break@loop
}
println("i = $i, j = $j")
}
}
}
输出结果:
i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 1, j = 4
i = 2, j = 1
相当于Java代码:
public static void main(String[] args) {
loop: for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= 4; j++) {
if (i == 2 && j == 2) {
break loop;
}
System.out.println("i = " + i + ", j = " + j);
}
}
}
结合 continue
初始代码:
fun main(args: Array<String>) {
tagsDemo@ for (i in 1..4) {
for (j in 1..4) {
if (i == 2 && j == 2) {
continue
}
println("i=$i, j=$j")
}
}
}
输出结果:
i=1, j=1
i=1, j=2
i=1, j=3
i=1, j=4
i=2, j=1
i=2, j=3
i=2, j=4
i=3, j=1
i=3, j=2
i=3, j=3
i=3, j=4
i=4, j=1
i=4, j=2
i=4, j=3
i=4, j=4
修改代码:
fun main(args: Array<String>) {
tagsDemo@ for (i in 1..4) {
for (j in 1..4) {
if (i == 2 && j == 2) {
continue@tagsDemo
}
println("i=$i, j=$j")
}
}
}
输出结果:
i=1, j=1
i=1, j=2
i=1, j=3
i=1, j=4
i=2, j=1
i=3, j=1
i=3, j=2
i=3, j=3
i=3, j=4
i=4, j=1
i=4, j=2
i=4, j=3
i=4, j=4
总结一下,第一个例子
break@tag
可以直接打断整个循环。第二个例子continue@tag
可以直接跳出内层不执行剩下的循环,回到最外层并继续循环。
结合 return
初始代码:
fun main(args: Array<String>) {
val intArray = intArrayOf(1, 2, 3, 0, 4, 5, 6)
intArray.forEach {
if (it == 0) return
print(it)
}
}
输出结果:
123
修改代码:
// 通常法
fun main(args: Array<String>) {
val intArray = intArrayOf(1, 2, 3, 0, 4, 5, 6)
intArray.forEach tag@{
if (it == 0) return@tag
print(it)
}
}
// 隐式法
fun main(args: Array<String>) {
val intArray = intArrayOf(1, 2, 3, 0, 4, 5, 6)
intArray.forEach {
if (it == 0) return@forEach
print(it)
}
}
// Lambda 法 -> 相当于递归
fun main(args: Array<String>) {
val ints = intArrayOf(1, 2, 3, 0, 4, 5, 6)
ints.forEach(fun(value: Int) {
if (value == 0) return
print(value)
})
}
输出结果:
123456
总结:使用
return@tag
可以根据特定的条件跳出循环,然后再返回方法中。