Kotlin學(xué)習(xí)(六): 包鹏浅、控制流隐砸、返回與跳轉(zhuǎn)

Simplest Version

本文是學(xué)習(xí)Kotlin的包相關(guān)褪那,控制流相關(guān)以及返回與跳轉(zhuǎn)相關(guān)博敬,與Java比較大的區(qū)別是Kotlin用when來替換掉Java的switch偏窝,寫好簡單祭往,可以有各種類型值的判斷硼补,另外可以指定返回和跳轉(zhuǎn)到指定標(biāo)簽的位置已骇。

包(Package)

與Java一樣褪储,Kotlin的源文件同樣以包聲明開始的乱豆。

package foo.bar

fun baz() {}

class Goo {}

// ...

源文件的所有內(nèi)容(如類和函數(shù))都包含在聲明的包中宛裕。
所以揩尸,在上面的例子中错负,baz()的全名是foo.bar.baz犹撒,Goo的全名是foo.bar.Goo

如果未指定包祥款,則此類文件的內(nèi)容屬于沒有名稱的“default”包刃跛。

導(dǎo)入(Imports)

Kotlin中除了模塊中默認導(dǎo)入的包,每個文件都可以被導(dǎo)入蛙酪。
如導(dǎo)入一個包里面的類文件

import foo.Bar // 導(dǎo)入foo包里面的Bar

如導(dǎo)入一個包里面的所有內(nèi)容(包脸狸,類,對象欲芹,等等)

import foo.* // foo中的所有都可以使用

如果命名有沖突,可以用as關(guān)鍵字來重命名解決沖突

import foo.Bar // Bar可以使用
import bar.Bar as bBar // bar.Bar可以直接用bBar表示

與Java不同浙宜,Kotlin沒有單獨的“import static”語法;
所有這些聲明都使用常規(guī)import關(guān)鍵字導(dǎo)入。

控制流(Control Flow)

Kotlin的控制流有if``when``for``while四種。

if表達式

在Kotlin中市怎,if表達式表示返回一個值(true或false),Kotlin中沒有三目運算符辱志。

//傳統(tǒng)用法
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分支智亮。

val max = if (a > b) a // 這樣寫是錯誤的
val max = if (a > b) a else b // 這樣才是正確的

when表達式

Kotlin中的when就類似與Java的switch癞埠,但是與switch不同

when (x) {
    1 -> print("x == 1")
    2 -> print("x == 2")
    else -> { // 默認
        print("x is neither 1 nor 2")
    }
}

在其它分支都不匹配的時候默認匹配 else 分支削锰,如果沒有把所有可能和分支條件列出來朋截,那么else是強制的蛹稍,這與switchdefault也有區(qū)別。

分支條件可以連在以前判斷

when (x) {
    0,1 -> print("x == 0 or x == 1")
    else -> print("otherwise")
}

分支的判斷條件可以用任意表達式

when (x) {
    parseInt(s) -> print("s encode x")
    else -> print("s does not encode x")
}

也可以用 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")
}

也可以用 is 或者 !is 來判斷值是否是某個類型部服,由于Kotlin可以自動判斷變量的類型稳摄,所有在滿足條件后的操作可以不用檢查就能使用相應(yīng)的屬性或方法。

val hasPrefix = when (x) {
    is String -> x.startsWith("prefix")
    else -> false
}

when甚至可以用來替換if-else if饲宿,將when設(shè)置無參數(shù)提供就是簡單的if表達式了

when {
    x.isOdd() -> print("x is odd")
    x.isEven() -> print("x is even")
    else -> print("x is funny")
}

用了when之后厦酬,Java的switch簡直就是辣雞。瘫想。

for循環(huán)

for循環(huán)的內(nèi)容可以是一個語句塊

for (item: Int in ints) {
    // ...
}

for 可以對任何提供的迭代器進行迭代仗阅,例如

  • has a member- or extension-function iterator(), whose return type
  • has a member- or extension-function next(), and
  • has a member- or extension-function hasNext() that returns Boolean.

如果需要使用list或者array的索引進行迭代,需這樣寫

for (i in array.indices) {
    print(array[i])
}

while循環(huán)

whiledo...while 與Java的一樣国夜,有一個區(qū)別是减噪,語句塊里面的變量在外面是可見的

while (x > 0) {
    x--
}

do {
    val y = retrieveData()
} while (y != null) // y 在這是可見的

返回與跳轉(zhuǎn)(Returns and Jumps)

Kotlin支持三種跳轉(zhuǎn)操作符

  • return,結(jié)束最近的閉合循環(huán)
  • break车吹,跳出最近的閉合循環(huán)
  • continue筹裕,跳到最近的閉合循環(huán)的下一次循環(huán)

break和continue標(biāo)簽(Break and Continue Labels)

Kotlin中的任何表達式都可以用標(biāo)簽標(biāo)記,標(biāo)簽是后面加@符號的標(biāo)識符的形式窄驹,例如:abc @朝卒,fooBar @

loop@ for (i in 1..100){ // loop@就是標(biāo)簽
    //...
}

使用break 跳轉(zhuǎn)到標(biāo)簽處乐埠,跳出循環(huán)

loop@ for (i in 1..10) {
    for (j in i..10) {
        if (j == 5) 
            break@loop // 跳出循環(huán)
        Log.e(Tag, j.toString()) // j 為5的時候跳出了循環(huán)抗斤,只打印1、2丈咐、3瑞眼、4
    }
}

使用continue跳轉(zhuǎn)到標(biāo)簽處,進行下一次循環(huán)

loop@ for (i in 1..10) {
    for (j in i..10) {
        if (j == 5) 
            continue@loop // 跳出本次循環(huán)棵逊,進行下一次循環(huán)
        Log.e(Tag, j.toString()) // j 為5的時候跳出了循環(huán)伤疙,所有不會打印5
    }
}

return標(biāo)簽(Return at Labels)

在字面函數(shù),局部函數(shù)辆影,以及對象表達式中徒像,函數(shù)可以在 Kotlin 中被包裹花吟。return允許返回到外層函數(shù)。

fun foo() {
    ints.forEach {
        if (it == 0) return // 跳出forEach
        print(it)
    }
}

return表達式返回到最近的閉合函數(shù)厨姚,比如 foo,如果返回從一個函數(shù)返回可以使用return標(biāo)簽

fun foo() {
    ints.forEach lit@ {
        it (it ==0) return@lit 
        // 這樣就不會return到foo函數(shù)键菱,而是return到標(biāo)簽處的forEach函數(shù)
        print(it)
    }
}

通常這種情況用一種更方便的標(biāo)簽谬墙,例如用一個和傳入的 Lambda 表達式名字相同的標(biāo)簽。

fun foo() {
    ints.forEach {
        if (it ==0) return@forEach 
        // 與上面一樣经备,return到標(biāo)簽處的forEach函數(shù)
        print(it)
    }
}

另外拭抬,可以用匿名函數(shù)替換lambda表達式,使用 return 語句可以從匿名函數(shù)中返回

fun foo() {
    ints.forEach(fun(value:  Int){
        if (value == 0) return
        print(value)
    })
}

當(dāng)返回一個值的時候侵蒙,如return@a 1造虎,表示在標(biāo)簽@a處返回1,而不是返回帶標(biāo)簽的表達式@a 1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纷闺,一起剝皮案震驚了整個濱河市算凿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌犁功,老刑警劉巖氓轰,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異浸卦,居然都是意外死亡署鸡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門限嫌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來靴庆,“玉大人,你說我怎么就攤上這事怒医÷悖” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵稚叹,是天一觀的道長端礼。 經(jīng)常有香客問我,道長入录,這世上最難降的妖魔是什么蛤奥? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮僚稿,結(jié)果婚禮上凡桥,老公的妹妹穿的比我還像新娘。我一直安慰自己蚀同,他們只是感情好缅刽,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布啊掏。 她就那樣靜靜地躺著,像睡著了一般衰猛。 火紅的嫁衣襯著肌膚如雪迟蜜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天啡省,我揣著相機與錄音娜睛,去河邊找鬼。 笑死卦睹,一個胖子當(dāng)著我的面吹牛畦戒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播结序,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼障斋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了徐鹤?” 一聲冷哼從身側(cè)響起垃环,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎返敬,沒想到半個月后晴裹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡救赐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年涧团,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片经磅。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡泌绣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出预厌,到底是詐尸還是另有隱情阿迈,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布轧叽,位于F島的核電站苗沧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏炭晒。R本人自食惡果不足惜待逞,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望网严。 院中可真熱鬧识樱,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至割疾,卻和暖如春嚎卫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宏榕。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工拓诸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人担扑。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像趣钱,于是被迫代替她去往敵國和親涌献。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容