流程控制

回到目錄
項(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á)式用, 必須寫成完整
if else 語句.

    @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 也是沒問題的.

    @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)語法, 比如 1..10 表示 IntRange 類
型. 是數(shù)學(xué)中封閉的 [1, 10] 區(qū)間內(nèi)所有整數(shù)的概念. 還有 CharRange, LongRange.

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

    /**
     *  演示 when 作為語句使用
     */
    @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") // 作為語句時(shí), 可以不寫 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 類型

forrange 一起用, 十分方便:

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

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

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

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

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

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

有三種形式

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

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

while

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

回到目錄

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容