本人也是在初學(xué)Kotlin,如有錯(cuò)誤薇正,請(qǐng)幫忙指出,持續(xù)更新
Android:Kotlin詳細(xì)入門學(xué)習(xí)指南-包-控制流-返回與跳轉(zhuǎn)-基礎(chǔ)語(yǔ)法(三)
建議先看看前面的文章
Android:Kotlin詳細(xì)入門學(xué)習(xí)指南-基礎(chǔ)語(yǔ)法(一)
Android:Kotlin詳細(xì)入門學(xué)習(xí)指南-基本類型-基礎(chǔ)語(yǔ)法(二)
這篇文章主要分享Kotlin中的-包-控制流-返回與跳轉(zhuǎn)
包
一個(gè)源文件以包聲明開始:
package foo.bar
fun bza() {}
class Goo {}
//...
源文件的所有內(nèi)容(比如類和函數(shù))都被包聲明包括儿奶。因此在上面的例子中沾凄, bza() 的全名應(yīng)該是 foo.bar.bza 梗醇, Goo 的全名是 foo.bar.Goo 。
如果沒有指定包名撒蟀,那這個(gè)文件的內(nèi)容就從屬于沒有名字的 “default” 包叙谨。
Imports
除了模塊中默認(rèn)導(dǎo)入的包,每個(gè)文件都可以有它自己的導(dǎo)入指令保屯。
import foo.Bar // Bar 現(xiàn)在可以不用條件就可以使用
import foo.*/ /foo 中的所有都可以使用
import bar.Bar as bBar // bBar 代表 'bar.Bar
import關(guān)鍵字不局限于導(dǎo)入類;您也可以使用它來導(dǎo)入其他聲明:
- – 頂級(jí)函數(shù)與屬性
- – 在對(duì)象聲明中聲明的函數(shù)和屬性
- – 枚舉常量
可見性和包嵌套
- 如果最頂?shù)穆暶鳂?biāo)注為 private , 那么它是自己對(duì)應(yīng)包私有手负。
- 如果包內(nèi)有私有的屬性或方法,那它對(duì)所有的子包是可見的姑尺。
- 注意包外的的成員是默認(rèn)不導(dǎo)入的竟终,比如在導(dǎo)入 foo.bar 后我們不能獲得 foo 的成員
流程控制
if 表達(dá)式
在 Kotlin 中,if 是表達(dá)式切蟋,它可以返回一個(gè)值统捶。因此Kotlin沒有三元運(yùn)算符 (condition ? then : else),因?yàn)閕f語(yǔ)句已經(jīng)滿足了效果。
// 傳統(tǒng)用法
var max = a
if (a < b)
max = b
// 帶 else
var max: Int
if (a > b)
max = a
else
max = b
// 作為表達(dá)式
val max = if (a > b) a else b
if分支可以作為塊柄粹,最后一個(gè)表達(dá)式是該塊的值:
val max = if (a > b){
print("Choose a")
a
}else{
print("Choose b")
b
}
如果使用If作為表達(dá)式而不是語(yǔ)句(例如喘鸟,返回其值或?qū)⑵滟x值給一個(gè)變量),則需要 有一個(gè)else分支驻右。
When 表達(dá)式
when 取代了 java 風(fēng)格語(yǔ)言的 switch 什黑。最簡(jiǎn)單的用法像下面這樣
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> { // 注意這個(gè)語(yǔ)句塊
print("x is neither 1 nor 2")
}
}
when會(huì)對(duì)所有的分支進(jìn)行檢查直到有一個(gè)條件滿足。when 可以用做表達(dá)式或聲 明堪夭。如果用作表達(dá)式的話愕把,那么滿足條件的分支就是總表達(dá)式。如果用做聲明森爽,那 么分支的值會(huì)被忽略礼华。(像 if 表達(dá)式一樣,每個(gè)分支是一個(gè)語(yǔ)句塊拗秘,而且它的值就是 最后一個(gè)表達(dá)式的值)
在其它分支都不匹配的時(shí)候默認(rèn)匹配 else 分支圣絮。如果把 when 做為表達(dá)式的話 else 分支是強(qiáng)制的,除非編譯器可以證明分支條件已經(jīng)覆蓋所有可能性雕旨。
如果有分支可以用同樣的方式處理的話扮匠,分支條件可以連在一起:
when (x) {
0,1 -> print("x == 0 or x == 1")
else -> print("otherwise")
}
甚至可以用 in 或者 !in 檢查值是否值在一個(gè)范圍或一個(gè)集合中
when (x) {
in 1..10 -> print("x is in the range")
in validNumbers -> print("x is valid")
!in 10..20 -> print("x is outside the range")
else -> print("none of the above")
}
for 循環(huán)
for 循環(huán)通過任何提供的迭代器進(jìn)行迭代。語(yǔ)法是下面這樣的:
for (item in collection)
print(item)
for 可以對(duì)任何提供的迭代器進(jìn)行迭代凡涩,迭代器的定義是
- – 有一個(gè) iterator() 成員函數(shù)或擴(kuò)展函數(shù)棒搜,其返回類型
- – 有一個(gè) next() 成員函數(shù)或擴(kuò)展函數(shù)
- – 有一個(gè)返回 Boolean 的 hasNext() 成員函數(shù)或擴(kuò)展函數(shù)
對(duì)數(shù)組的for循環(huán)不會(huì)創(chuàng)建迭代器對(duì)象,而是被編譯成一個(gè)基于索引的循環(huán).
如果你想通過 list 或者 array 的索引進(jìn)行迭代活箕,
for (i in array.indices)
print(array[i])
while 循環(huán)
while 和 do…while 像java那樣
while (x > 0) {
x--
}
do {
val y = retrieveData()
} while (y != null) // y 在這是可見的
在循環(huán)中使用 break 和 continue
kotlin 支持傳統(tǒng)的 break 和 continue 操作符
返回與跳轉(zhuǎn)
Kotlin 有三種結(jié)構(gòu)跳轉(zhuǎn)表達(dá)式:
- – return
- – break 結(jié)束最近的閉合循環(huán)
- – continue 跳到最近的閉合循環(huán)的下一次循環(huán)
break 和 continue 標(biāo)簽
在 Kotlin 中表達(dá)式可以添加標(biāo)簽力麸。標(biāo)簽通過 @ 結(jié)尾來表示,比 如: abc@ , fooBar@ 都是有效的在這里插入代碼片
克蚂。使用標(biāo)簽語(yǔ)法只需像這樣:
loop@ for (i in 1..100){
// ...
}
現(xiàn)在我們可以用標(biāo)簽實(shí)現(xiàn) break 或者 continue 的快速跳轉(zhuǎn):
loop@ for (i in 1..100) {
for (j in i..100) {
if (...)
break@loop
}
}
break 是跳轉(zhuǎn)標(biāo)簽后面的表達(dá)式闺鲸,continue 是跳轉(zhuǎn)到循環(huán)的下一次迭代。
返回到標(biāo)簽
在字面函數(shù)埃叭,局部函數(shù)摸恍,以及對(duì)象表達(dá)式中,函數(shù)可以在 Kotlin 中被包裹赤屋。return 允許我們返回到外層函數(shù)立镶。最重要的例子就是從字面函數(shù)中返回
fun foo() {
ints.forEach {
if (it == 0) return
print(it)
}
}
return 表達(dá)式返回到最近的閉合函數(shù),比如 foo (注意這樣非局部返回僅僅可以 在內(nèi)聯(lián)函數(shù)中使用)类早。如果我們需要從一個(gè)字面函數(shù)返回可以使用標(biāo)簽修飾 return :
fun foo() {
ints.forEach lit@ {
if (it ==0) return@lit
print(it)
}
}
現(xiàn)在它僅僅從字面函數(shù)中返回媚媒。經(jīng)常用一種更方便的含蓄的標(biāo)簽:比如用和傳入的 lambda 表達(dá)式名字相同的標(biāo)簽。
fun foo() {
ints.forEach {
if (it == 0) return@forEach
print(it)
}
}
另外涩僻,我們可以用函數(shù)表達(dá)式替代匿名函數(shù)欣范。在函數(shù)表達(dá)式中使用 return 語(yǔ)句可以 從函數(shù)表達(dá)式中返回。
fun foo() {
ints.forEach(fun(value: Int){
if (value == 0) return
print(value)
})
}
當(dāng)返回一個(gè)值時(shí)令哟,解析器給了一個(gè)參考
return@a 1
表示 “在標(biāo)簽 @a 返回 1 ” 而不是返回一個(gè)標(biāo)簽表達(dá)式 (@a 1)
命名函數(shù)自動(dòng)定義標(biāo)簽:
foo outer() {
foo inner() {
return@outer
}
}