本人也是在初學Kotlin,如有錯誤,請幫忙指出,持續更新
Android:Kotlin詳細入門學習指南-包-控制流-返回與跳轉-基礎語法(三)
建議先看看前面的文章
Android:Kotlin詳細入門學習指南-基礎語法(一)
Android:Kotlin詳細入門學習指南-基本類型-基礎語法(二)
這篇文章主要分享Kotlin中的-包-控制流-返回與跳轉
包
一個源文件以包聲明開始:
package foo.bar
fun bza() {}
class Goo {}
//...
源文件的所有內容(比如類和函數)都被包聲明包括。因此在上面的例子中, bza() 的全名應該是 foo.bar.bza , Goo 的全名是 foo.bar.Goo 。
如果沒有指定包名,那這個文件的內容就從屬於沒有名字的 “default” 包。
Imports
除了模塊中默認導入的包,每個文件都可以有它自己的導入指令。
import foo.Bar // Bar 現在可以不用條件就可以使用
import foo.*/ /foo 中的所有都可以使用
import bar.Bar as bBar // bBar 代表 'bar.Bar
import關鍵字不侷限於導入類;您也可以使用它來導入其他聲明:
- – 頂級函數與屬性
- – 在對象聲明中聲明的函數和屬性
- – 枚舉常量
可見性和包嵌套
- 如果最頂的聲明標註爲 private , 那麼它是自己對應包私有。
- 如果包內有私有的屬性或方法,那它對所有的子包是可見的。
- 注意包外的的成員是默認不導入的,比如在導入 foo.bar 後我們不能獲得 foo 的成員
流程控制
if 表達式
在 Kotlin 中,if 是表達式,它可以返回一個值。因此Kotlin沒有三元運算符 (condition ? then : else),因爲if語句已經滿足了效果。
// 傳統用法
var max = a
if (a < b)
max = b
// 帶 else
var max: Int
if (a > b)
max = a
else
max = b
// 作爲表達式
val max = if (a > b) a else b
if分支可以作爲塊,最後一個表達式是該塊的值:
val max = if (a > b){
print("Choose a")
a
}else{
print("Choose b")
b
}
如果使用If作爲表達式而不是語句(例如,返回其值或將其賦值給一個變量),則需要 有一個else分支。
When 表達式
when 取代了 java 風格語言的 switch 。最簡單的用法像下面這樣
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> { // 注意這個語句塊
print("x is neither 1 nor 2")
}
}
when會對所有的分支進行檢查直到有一個條件滿足。when 可以用做表達式或聲 明。如果用作表達式的話,那麼滿足條件的分支就是總表達式。如果用做聲明,那 麼分支的值會被忽略。(像 if 表達式一樣,每個分支是一個語句塊,而且它的值就是 最後一個表達式的值)
在其它分支都不匹配的時候默認匹配 else 分支。如果把 when 做爲表達式的話 else 分支是強制的,除非編譯器可以證明分支條件已經覆蓋所有可能性。
如果有分支可以用同樣的方式處理的話,分支條件可以連在一起:
when (x) {
0,1 -> print("x == 0 or x == 1")
else -> print("otherwise")
}
甚至可以用 in 或者 !in 檢查值是否值在一個範圍或一個集合中
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 循環
for 循環通過任何提供的迭代器進行迭代。語法是下面這樣的:
for (item in collection)
print(item)
for 可以對任何提供的迭代器進行迭代,迭代器的定義是
- – 有一個 iterator() 成員函數或擴展函數,其返回類型
- – 有一個 next() 成員函數或擴展函數
- – 有一個返回 Boolean 的 hasNext() 成員函數或擴展函數
對數組的for循環不會創建迭代器對象,而是被編譯成一個基於索引的循環.
如果你想通過 list 或者 array 的索引進行迭代,
for (i in array.indices)
print(array[i])
while 循環
while 和 do…while 像java那樣
while (x > 0) {
x--
}
do {
val y = retrieveData()
} while (y != null) // y 在這是可見的
在循環中使用 break 和 continue
kotlin 支持傳統的 break 和 continue 操作符
返回與跳轉
Kotlin 有三種結構跳轉表達式:
- – return
- – break 結束最近的閉合循環
- – continue 跳到最近的閉合循環的下一次循環
break 和 continue 標籤
在 Kotlin 中表達式可以添加標籤。標籤通過 @ 結尾來表示,比 如: abc@ , fooBar@ 都是有效的在這裏插入代碼片
。使用標籤語法只需像這樣:
loop@ for (i in 1..100){
// ...
}
現在我們可以用標籤實現 break 或者 continue 的快速跳轉:
loop@ for (i in 1..100) {
for (j in i..100) {
if (...)
break@loop
}
}
break 是跳轉標籤後面的表達式,continue 是跳轉到循環的下一次迭代。
返回到標籤
在字面函數,局部函數,以及對象表達式中,函數可以在 Kotlin 中被包裹。return 允許我們返回到外層函數。最重要的例子就是從字面函數中返回
fun foo() {
ints.forEach {
if (it == 0) return
print(it)
}
}
return 表達式返回到最近的閉合函數,比如 foo (注意這樣非局部返回僅僅可以 在內聯函數中使用)。如果我們需要從一個字面函數返回可以使用標籤修飾 return :
fun foo() {
ints.forEach lit@ {
if (it ==0) return@lit
print(it)
}
}
現在它僅僅從字面函數中返回。經常用一種更方便的含蓄的標籤:比如用和傳入的 lambda 表達式名字相同的標籤。
fun foo() {
ints.forEach {
if (it == 0) return@forEach
print(it)
}
}
另外,我們可以用函數表達式替代匿名函數。在函數表達式中使用 return 語句可以 從函數表達式中返回。
fun foo() {
ints.forEach(fun(value: Int){
if (value == 0) return
print(value)
})
}
當返回一個值時,解析器給了一個參考
return@a 1
表示 “在標籤 @a 返回 1 ” 而不是返回一個標籤表達式 (@a 1)
命名函數自動定義標籤:
foo outer() {
foo inner() {
return@outer
}
}