kotlin
有三种结构跳转表达式:
-
return
会从最近的封闭函数或匿名函数返回。 -
break
终止最近的封闭循环。 -
continue
继续最近的封闭循环的下一步。
所有这些表达式都可以作为其他表达式的一本分使用
val s = person.name ?: return
val s = person.name ?: return
这行代码的意思是尝试从person
对象中获取name
属性的值,并将其赋值给变量s
。如果person.name
存在,那么它的值就会被赋值给s
。但是,如果person.name
为null,那么return
语句会被执行,当前函数会立即返回,不再执行后续的代码。这是Elvis
操作符?:
的一个常见用法。
break / continue
基本使用方法
fun main() {for (i in 1..5) {if ( i == 2){break // 结束循环}println(i)// 1}for (i in 1..5) {if ( i == 2){continue // 跳过本次循环,进入下次循环}println(i)// 1// 3// 4// 5}
}
任何表达式都可以用标签进行标记,使用@
符号
fun main() {loop@ for (i in 1..100) {// ...}
}
我们可以快速break
或者continue
一个标签
fun main() {loop1@ for (c in 'a'..'c') {for (i in 1..3) {if (c == 'b') {break@loop1 // 结束循环}println("$c $i")
// a 1
// a 2
// a 3}}loop2@ for (c in 'a'..'c') {for (i in 1..3) {if (c == 'b') {continue@loop2 // 结束循环}println("$c $i")
// a 1
// a 2
// a 3
// c 1
// c 2
// c 3}}
}
return
fun main() {foo()
// 1
// 2
}fun foo() {listOf(1, 2, 3, 4, 5).forEach {if (it == 3) return println(it)}println("方法执行完了") // 当前行未执行,上边的return直接结束了foo方法
}
给lambda
加标签并return
fun main() {foo()
// 1
// 2
// 4
// 5
// 方法执行完了
}fun foo() {listOf(1, 2, 3, 4, 5).forEach foo@{if (it == 3) return@fooprintln(it)}println("方法执行完了")
}
使用隐式标签返回,统称隐式标签和lambda
表达式具有相同的名称
fun main() {foo()
// 1
// 2
// 4
// 5
// 方法执行完了
}fun foo() {listOf(1, 2, 3, 4, 5).forEach {if (it == 3) return@forEachprintln(it)}println("方法执行完了") // 当前行未执行,上边的return直接结束了foo方法
}
将lambda
表达式换成匿名函数后,使用return
将结束匿名函数,不对循环起作用
fun main() {foo()
// 1
// 2
// 4
// 5
// 方法执行完了
}fun foo() {listOf(1, 2, 3, 4, 5).forEach(fun(value: Int) {if (value == 3) returnprintln(value)})print("方法执行完了")
}
当返回一个值时,解析器优先考虑合格的返回:
return@a 1
这意味着 “在标签 @a
处返回 1
”,而不是 “返回一个带标签的表达式 @a 1
”。