3、Kotlin基礎---條件控制&循環控制

說在前面,程序語言的控制是程序設計中比較基礎的語法,如果大家有一定的語法基礎,可以粗略看一下本章節,
知道條件控制和循環控制在Kotlin中是如何使用的即可。

1、if 表達式
一個 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
}

這也說明我也不需要像Java那種有一個三元操作符,因為我們可以使用它來簡單實現:

    val c = if (condition) a else b

使用區間
使用 in 運算符來檢測某個數字是否在指定區間內,區間格式為 x..y :

    實例:
    fun main(args: Array<String>) {
        val x = 5
        val y = 9
        if (x in 1..8) {
            println("x 在區間內")
        }
    }

2、When 表達式
when 將它的參數和所有的分支條件順序比較,直到某個分支滿足條件。
when 既可以被當做表達式使用也可以被當做語句使用。如果它被當做表達式,符合條件的分支的值就是整個表達式的值,如果當做語句使用, 則忽略個別分支的值。

when 類似其他語言的 switch 操作符。其最簡單的形式如下:

when (x) {
    1 -> print("x == 1")
    2 -> print("x == 2")
    else -> { // 注意這個塊
        print("x 不是 1 ,也不是 2")
    }
}

在 when 中,else 同 switch 的 default。如果其他分支都不滿足條件將會求值 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")
}

另一種可能性是檢測一個值是(is)或者不是(!is)一個特定類型的值。注意: 由于智能轉換,你可以訪問該類型的方法和屬性而無需 任何額外的檢測。

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

when 也可以用來取代 if-else if鏈。 如果不提供參數,所有的分支條件都是簡單的布爾表達式,而當一個分支的條件為真時則執行該分支:

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

3、For 循環
for 循環可以對任何提供迭代器(iterator)的對象進行遍歷,語法如下:

for (item in collection) print(item)

循環體可以是一個代碼塊:

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

如上所述,for 可以循環遍歷任何提供了迭代器的對象。

如果你想要通過索引遍歷一個數組或者一個 list,你可以這么做:

 var array = arrayListOf("object0","object1","object2")  //這里數組的聲明也和java不一樣
 for(i in array.indices){    //使用索引遍歷
    println(array[i])
 }

注意這種"在區間上遍歷"會編譯成優化的實現而不會創建額外對象。

或者你可以用庫函數 withIndex:

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

實例:對集合進行迭代:

//遍歷一個集合
val items = listOf("apple","banana","kiwi")
for(item in items){
    println(item)
}

while 與 do...while 循環
while是最基本的循環,它的結構為:

while( 布爾表達式 ) {
  //循環內容
}

do…while 循環 對于 while 語句而言,如果不滿足條件,則不能進入循環。但有時候我們需要即使不滿足條件,也至少執行一次。

do…while 循環和 while 循環相似,不同的是,do…while 循環至少會執行一次。

do {
       //代碼語句
}while(布爾表達式);

實例:

//while與do...while循環
var x = 5
while(x > 0){
    println(x--)
}

var y = 5
do{
    println(y--)
}while(y>0)

返回和跳轉
Kotlin 有三種結構化跳轉表達式:
return。默認從最直接包圍它的函數或者匿名函數返回。
break。終止最直接包圍它的循環。
continue。繼續下一次最直接包圍它的循環。
在循環中 Kotlin 支持傳統的 break 和 continue 操作符。

//循環中的返回和跳轉
for(i in 1..10){
  for(i in 1..10){
      if(i==3)continue   //i為3時跳出當前循環,繼續下一下循環
      println(i)
      if(i>5)break  //i為6時跳出循環
  }
}

Break 和 Continue 標簽
在 Kotlin 中任何表達式都可以用標簽(label)來標記。 標簽的格式為標識符后跟 @ 符號,例如:abc@、fooBar@都是有效的標簽。 要為一個表達式加標簽,我們只要在其前加標簽即可。

loop@ for (i in 1..100) {
    // ……
}

現在,我們可以用標簽限制 break 或者continue:

//使用標簽結束循環
loop@for(i in 1..100){
    for(j in 1..100){
        if(j==50)break@loop
    }
}

標簽限制的 break 跳轉到剛好位于該標簽指定的循環后面的執行點。 continue 繼續標簽指定的循環的下一次迭代。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,488評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,034評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,327評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,554評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,337評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,883評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,975評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,114評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,625評論 1 332
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,555評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,737評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,244評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,973評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,615評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,343評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,699評論 2 370

推薦閱讀更多精彩內容