Android:Kotlin詳細入門學習指南-包-控制流-返回與跳轉-基礎語法(三)

本人也是在初學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 
    } 
}

這篇文章主要分享Kotlin中的-包-控制流-返回與跳轉

本人也是在初學Kotlin,如有錯誤,請幫忙指出,持續更新

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章