簡介
本篇博客主要是介紹Kotlin語法中的【返回和跳轉】相關的知識,幫助各位更快的掌握Kotlin,如果有疏漏或者錯誤,請在留言中指正,謝謝。 系列彙總地址
返回和跳轉
kotlin中有三種結構化跳轉表達式:
- return: 默認從直接包圍的函數或匿名函數返回。
- break: 終止最直接包圍它的循環。
- continue: 繼續下次最直接包圍它的循環。
從上面的介紹中我們可以看出,和java是一致的,在此不再贅述,下面介紹點特殊用法。
標籤
在Kotlin中任何表達式都可以用標籤來標記。標記的格式爲:標識符+@,例如,abc@
。如果想爲一個表達式加標籤,可按照如下方式去寫:
loop@ if (true){ //在表達式的前面加標籤
}
break和continue標籤
對於break
和continue
默認情況下隻影響最直接包圍它的循環,想跳出多層循環就不可以了,但是加上標籤效果便不在一樣,代碼如下:
示例1,break標籤:
loop@ for (i in 1..10) {
for (j in 1..10) {
if (j == 2) {
break@loop
}
println(i.toString() + ":" + j.toString())
}
}
此時的輸出如下:
1:1
通過結果我們可以看出,break
+標籤 可以跳到標籤的位置,且跳轉到標籤指定的循環後面的執行點。 如果使用continue
,會有怎樣的變化?
loop@ for (i in 1..10) {
for (j in 1..10) {
if (j == 2) {
continue@loop //只是修改此處
}
println(i.toString() + ":" + j.toString())
}
}
結果如下:
1:1
2:1
3:1
4:1
5:1
6:1
7:1
8:1
9:1
10:1
從結果我們可以看出,continue
+標籤 跳轉到循環的下一次迭代。
return 標籤
Kotlin 有函數字面量、局部函數和對象表達式(函數相關後續會專門詳細解釋)。因此 Kotlin 的函數可以被嵌套。 標籤限制的 return 允許我們從外層函數返回。 最重要的一個用途就是從 lambda 表達式中返回。示例如下:
fun foo() {
ints.forEach {
if (it == 0) return
print(it)
}
}
這個 return
表達式從最直接包圍它的函數即 foo
中返回。 (注意,這種非局部的返回只支持傳給內聯函數的 lambda
表達式。) 如果我們需要從 lambda
表達式中返回,我們必須給它加標籤並用以限制 return
。
fun foo() {
ints.forEach lit@ { //注意此處的位置
if (it == 0) return@lit
print(it)
}
}
現在,它只會從 lambda
表達式中返回。通常情況下使用隱式標籤更方便。 該標籤與接受該 lambda
的函數同名。
fun foo() {
ints.forEach {
if (it == 0) return@forEach
print(it)
}
}
或者,我們用一個匿名函數替代 lambda
表達式。 匿名函數內部的 return
語句將從該匿名函數自身返回
fun foo() {
ints.forEach(fun(value: Int) {
if (value == 0) return
print(value)
})
}
當要返一個回值的時候,解析器優先選用標籤限制的 return
,即
return@a 1
其含義爲“從標籤 @a 返回 1”,而不是“返回一個標籤標註的表達式 (@a 1)”
補充
Kotlin中有許多簡便的表達式,下面我們介紹一下。
if not null
代碼說明:
//if not null
var data: ArrayList<String>? = ArrayList<String>() //此時不爲null
println(data?.size) //輸出: 0
data = null //此時爲null
println(data?.size) //輸出: null
總結:data?.size
表達式的意思是:如果data
不是null
,則輸出data.size
反之如果是null
則返回null
if null
代碼說明:
data = null //此時爲null
println(data ?: "這個是空的") //輸出:這個是空的
data =1
println(data ?: "這個是空的") //輸出:1
總結:data?:"測試"
表達式的含義是:如果data
是null
則運行:
後的語句或者方法,反之則返回data
自身。
if not null else=> if null(if not null)
代碼說明:
data = null //此時爲null
println(data?.size ?:"這個是空的。。。")
data = ArrayList<String>()//不爲null
println(data?.size ?:"這個是空的。。。")
總結:從標題我們就可以看出,這個可以理解爲上面的兩個表達式的合集,data?.size ?:"這個是空的。。。"
表達式的含義是:如果data
不是null
則返回data.size
,如果是null
則運行:
後的語句或者方法。
換個思路去想:首先表達式總體上是個if null-> object?:"測試"
,而object-> if not null->data?.size
,這樣就比較好理解了,當data
爲null
的時候,if not null
,返回null(object爲null)
,又因爲 if null
,所以會執行:
後的內容,反之不是null
,則會執行data.size
,又因爲if null
條件不滿足,所以後續不會執行。
if not null 然後執行代碼
代碼說明:
data?.let { //如果data不爲null會自行let代碼塊內的內容
println("data不爲null,執行此處")
}
總結
至此已經學完了Kotlin的【返回和跳轉】相關的知識,多回顧多思考,繼續後續內容。