流程控制

回到目錄
項(xiàng)目源碼 kotlin-basics 項(xiàng)目


if

Kotlin 中 if 可以當(dāng)成傳統(tǒng)的 if 使用, 例如:

    @Test fun testIf() {
        // 可以跟以前以前使用 if
        val a = 10
        val b = 20
        if(a > b) {
            assertTrue(a > b)
        } else {
            assertTrue(!(a > b))
        }
    }

Kotlin 中 if 是表達(dá)式, 即它會(huì)有一個(gè)返回值. 如果把 if 當(dāng)做表達(dá)式用, 必須寫(xiě)成完整
if else 語(yǔ)句.

    @Test fun testIfExpr() {
        // if 是表達(dá)式
        val a = 10
        val b = 20
        val c = if(a > b) a else b
        assertTrue(c == b)
        // Kotlin 中不可以這樣, 也不需要它了
        // if 完美替代, 可讀性更好
        // val x = a > b? a: b

        // 花括號(hào)也是可以的, 返回的是花括號(hào)內(nèi)最后表達(dá)式的值
        val max = if (a > b) {
            println("a is greater than b")
            a
        } else {
            println("a is not greater than b")
            b
        }
        assertEquals(b, max)
    }

嵌套使用 if else 也是沒(méi)問(wèn)題的.

    @Test fun testNestedIf() {
        val a = 3
        val b = 5
        val c = 1

        val max = if (a > b) {
            if (a > c)
                a
            else
                c
        } else {
            if (b > c)
                b
            else
                c
        }
        assertTrue(max == 5)
    }

超級(jí)牛逼的 when

when 之前先介紹一下 kotlin 中的范圍(Range)語(yǔ)法, 比如 1..10 表示 IntRange 類(lèi)
型. 是數(shù)學(xué)中封閉的 [1, 10] 區(qū)間內(nèi)所有整數(shù)的概念. 還有 CharRange, LongRange.

when 形式上比較像 java 的 switch, 但是 Kotlin 中的 when 十分牛逼.
if 一樣, 可以當(dāng)成語(yǔ)句使用, 也可以當(dāng)成一個(gè)表達(dá)式, 如果作為表達(dá)式,
when 中必須帶上 else 分支, 除非編譯器能檢查到你的分支已經(jīng)覆蓋全部情況.

    /**
     *  演示 when 作為語(yǔ)句使用
     */
    @Test fun testWhen() {
        val a = 10
        when(a) {
            1 -> assertTrue(a == 1) // 只有簡(jiǎn)單一個(gè)表達(dá)式可以省略花括號(hào)
            3 -> { assertTrue(a == 3) }
            5 -> { println("a = $a") }
            else -> println("a > 5") // 作為語(yǔ)句時(shí), 可以不寫(xiě) else 的.
        }
    }

    /**
     *  演示 when 作為表達(dá)式
     */
    @Test fun testWhenExpr() {
         val a = 6
        val result = when(a) {
            1 -> "a == 1"
            3 -> {
                println(" a == $a")
                "a == 3"
            }
            5 -> { "a == 5" }
            else -> "a > 5"
        }
        assertEquals("a > 5", result)
    }

分支合并功能了解一下:

    @Test fun testWhenMerge() {
        val n = 2
        val result = when (n) {
            1, 2, 3 -> "x"
            4 -> "xx"
            else -> "xxx"
        }
        assertEquals("x", result)
    }

配合 range, 達(dá)到范圍檢測(cè)的功能:

    @Test fun testWhenRange() {
        val n = 40
        val result = when (n) {
            in 1..10 -> 1
            in 11..20 -> 2
            in 21..30 -> 3
            in 31..40 -> 4
            in 41..50 -> 5
            else -> 10
        }
        assertTrue(result == 4)
    }

for

for 循環(huán) range 類(lèi)型

forrange 一起用, 十分方便:

@Test fun testFor() {
        for(a in 1..10) { // a 前面不要寫(xiě) var
            println(a)
        }
    }

在 kotlin 中, 如果一個(gè)語(yǔ)句塊(使用 {} 包裹的代碼段)里面只有一條語(yǔ)句, 那么 {}
是可以省略不寫(xiě)的.

    @Test fun testForOneExpr() {
        // 只有一個(gè)語(yǔ)句, 可以省略花括號(hào)
        for(a in 1..10)
            println(a)

        // 或者寫(xiě)在同一行
        for(a in 11..20) println(a)
    }

range 有很多形式, 1..10 這種是最常用的, 還有例如 10 downTo 1, 1..10 step 3
等各種用法, 滿(mǎn)足各種循環(huán)需求

for 循環(huán)數(shù)組類(lèi)型

有三種形式

  1. 循環(huán)里面的元素, 不帶索引的
    @Test fun testForArrayItem() {
        val names = arrayOf("aaa", "bbb", "ccc")
        for(name in names)
            println(name)

    }
  1. 循環(huán)里面的索引
    @Test fun testForArrayIndex() {
        val names = arrayOf("aaa", "bbb", "ccc")
        // 數(shù)組的 indices 屬性會(huì)返回一個(gè) IntRange
        for(index in names.indices)
            println(names[index])
    }
  1. 兩個(gè)一起循環(huán)
    @Test fun testForArrayIndexItem() {
        val names = arrayOf("aaa", "bbb", "ccc")
        for((index, item) in names.withIndex())
            println("第 ${index + 1} 個(gè)名字是 $item")
    }

(index, item) in names.withIndex() 這種語(yǔ)法你可能會(huì)比較陌生, 其實(shí)這是一種解構(gòu)
賦值. withIndex() 返回一個(gè)可迭代的集合, 里面的元素是 IndexedValue<String>
類(lèi)型, 這是一個(gè)數(shù)據(jù)類(lèi), 而數(shù)據(jù)類(lèi)已經(jīng)默認(rèn)實(shí)現(xiàn)解構(gòu)賦值了.

解構(gòu)賦值的詳細(xì)知識(shí)點(diǎn)以后會(huì)講到.

while

whiledo while 跟 java 中的沒(méi)區(qū)別.

回到目錄

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末空骚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖行疏,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丢胚,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡来农,警方通過(guò)查閱死者的電腦和手機(jī)寒波,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)乘盼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人俄烁,你說(shuō)我怎么就攤上這事绸栅。” “怎么了页屠?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵粹胯,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我辰企,道長(zhǎng)风纠,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任牢贸,我火速辦了婚禮竹观,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘潜索。我一直安慰自己臭增,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布帮辟。 她就那樣靜靜地躺著速址,像睡著了一般玩焰。 火紅的嫁衣襯著肌膚如雪由驹。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音蔓榄,去河邊找鬼并炮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛甥郑,可吹牛的內(nèi)容都是我干的逃魄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼澜搅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼伍俘!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起勉躺,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤癌瘾,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后饵溅,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體妨退,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年蜕企,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了咬荷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡轻掩,死狀恐怖幸乒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情放典,我是刑警寧澤逝变,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站奋构,受9級(jí)特大地震影響壳影,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弥臼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一宴咧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧径缅,春花似錦掺栅、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至氏堤,卻和暖如春沙绝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工闪檬, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留星著,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓粗悯,卻偏偏與公主長(zhǎng)得像虚循,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子样傍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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