Kotlin基礎之流程控制(Control Flow)

if表達式

在Kotlin中列赎,if是表達式,即返回一個值响逢。 因此沒有三元運算符(condition棍厂?then:else)末誓,if的普通用法就能很好的完成工作。

// Traditional usage 
var max = a 
if (a < b) max = b

// With else 
var max: Int
if (a > b) {
    max = a
} else {
    max = b
}
 
// As expression 
val max = if (a > b) a else b

如果分支是代碼塊书蚪,則以最后一個表達式作為該代碼塊的值:

val max = if (a > b) {
    print("Choose a")
    a
} else {
    print("Choose b")
    b
}

如果您正在使用if作為表達式而不是語句(即返回其值或將其分配給某個變量)喇澡,則表達式需要具有其他分支。

when表達式

when表達式用于替換像C語言中的switch語句殊校,最簡單的形式如下:

when (x) {
    1 -> print("x == 1")
    2 -> print("x == 2")
    else -> { // Note the block
        print("x is neither 1 nor 2")
    }
}

when將它的參數(shù)與所有的分支順序匹配晴玖,直到滿足某一些分支條件。 when也可以用作表達式或作為語句为流。 如果將其用作表達式呕屎,則滿足分支的值將變?yōu)檎w表達式的值。 如果將其用作語句艺谆,被匹配分支的值將被忽略。(就像if拜英,每個分支可以是一個塊静汤,其值是塊中最后一個表達式的值。)

如果不匹配其他分支條件居凶,則執(zhí)行else分支虫给。 若when被用作表達式,則else分支是必需的侠碧,除非編譯器可以證明所有可能的情況都被分支條件覆蓋抹估。

如果多種情況可以被歸為一類,則被歸于一類的分支條件可以以逗號組合:

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

可以使用任意表達式(不僅僅是常量)作為分支條件:

when (x) {
    parseInt(s) -> print("s encodes 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來檢查一個值是否屬于指定類型替饿。 請注意语泽,由于is判斷成功后的智能轉換,可以直接訪問目標類型的方法和屬性视卢,而無需任何額外檢查:

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

when也可以用來替代if-else-if鏈踱卵。 如果沒有為when關鍵字提供參數(shù),則分支條件是簡單的布爾表達式据过,當條件為真時執(zhí)行分支:

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

for循環(huán)

凡是可以提供迭代器的類型或對象惋砂,for語句都可以對其遍歷。 語法如下:

for (item in collection) print(item)

執(zhí)行體也可以是語句塊:

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

如前所述绳锅,for語句可以迭代任何可以提供迭代器的內容西饵,如:

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

所有這三個函數(shù)都需要被標記為operator

使用for語句來循環(huán)數(shù)組的時候鳞芙,被編譯為一個基于索引的循環(huán)罗标,它不會創(chuàng)建一個迭代器對象庸队。

如果要遍歷具有索引的數(shù)組或列表,可以這樣做:

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

注意:這個“通過范圍的迭代”被編譯成最佳實現(xiàn)闯割,沒有創(chuàng)建額外的對象彻消。

除此之外,也可以使用withIndex庫函數(shù)宙拉,如下所示:

for ((index, value) in array.withIndex()) {
    println("the element at $index is $value")
}

while循環(huán)

while循環(huán)和do...while循環(huán)和平常使用的方法一樣:

while (x > 0) {
    x--
}

do {
    val y = retrieveData()
} while (y != null) // y is visible here!

循環(huán)中的break和continue

Kotlin在循環(huán)操作中支持傳統(tǒng)的break和continue關鍵字宾尚。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市谢澈,隨后出現(xiàn)的幾起案子煌贴,更是在濱河造成了極大的恐慌,老刑警劉巖锥忿,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牛郑,死亡現(xiàn)場離奇詭異,居然都是意外死亡敬鬓,警方通過查閱死者的電腦和手機淹朋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钉答,“玉大人础芍,你說我怎么就攤上這事∈颍” “怎么了仑性?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長右蹦。 經常有香客問我诊杆,道長,這世上最難降的妖魔是什么何陆? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任刽辙,我火速辦了婚禮,結果婚禮上甲献,老公的妹妹穿的比我還像新娘宰缤。我一直安慰自己,他們只是感情好晃洒,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布慨灭。 她就那樣靜靜地躺著,像睡著了一般球及。 火紅的嫁衣襯著肌膚如雪氧骤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天吃引,我揣著相機與錄音筹陵,去河邊找鬼刽锤。 笑死,一個胖子當著我的面吹牛朦佩,可吹牛的內容都是我干的并思。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼语稠,長吁一口氣:“原來是場噩夢啊……” “哼宋彼!你這毒婦竟也來了?” 一聲冷哼從身側響起仙畦,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤输涕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后慨畸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體莱坎,經...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年寸士,在試婚紗的時候發(fā)現(xiàn)自己被綠了檐什。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡碉京,死狀恐怖厢汹,靈堂內的尸體忽然破棺而出螟深,到底是詐尸還是另有隱情谐宙,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布界弧,位于F島的核電站凡蜻,受9級特大地震影響,放射性物質發(fā)生泄漏垢箕。R本人自食惡果不足惜划栓,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望条获。 院中可真熱鬧忠荞,春花似錦、人聲如沸帅掘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽修档。三九已至碧绞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吱窝,已是汗流浹背讥邻。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工迫靖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人兴使。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓系宜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鲫惶。 傳聞我的和親對象是個殘疾皇子蜈首,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內容