流程控制

回到目录
项目源码 kotlin-basics 项目


if

Kotlin 中 if 可以当成传统的 if 使用, 例如:

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

Kotlin 中 if 是表达式, 即它会有一个返回值. 如果把 if 当做表达式用, 必须写成完整
if else 语句.

    @Test fun testIfExpr() {
        // if 是表达式
        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

        // 花括号也是可以的, 返回的是花括号内最后表达式的值
        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)
    }

超级牛逼的 when

when 之前先介绍一下 kotlin 中的范围(Range)语法, 比如 1..10 表示 IntRange 类
型. 是数学中封闭的 [1, 10] 区间内所有整数的概念. 还有 CharRange, LongRange.

when 形式上比较像 java 的 switch, 但是 Kotlin 中的 when 十分牛逼.
if 一样, 可以当成语句使用, 也可以当成一个表达式, 如果作为表达式,
when 中必须带上 else 分支, 除非编译器能检查到你的分支已经覆盖全部情况.

    /**
     *  演示 when 作为语句使用
     */
    @Test fun testWhen() {
        val a = 10
        when(a) {
            1 -> assertTrue(a == 1) // 只有简单一个表达式可以省略花括号
            3 -> { assertTrue(a == 3) }
            5 -> { println("a = $a") }
            else -> println("a > 5") // 作为语句时, 可以不写 else 的.
        }
    }

    /**
     *  演示 when 作为表达式
     */
    @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, 达到范围检测的功能:

    @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 循环 range 类型

forrange 一起用, 十分方便:

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

在 kotlin 中, 如果一个语句块(使用 {} 包裹的代码段)里面只有一条语句, 那么 {}
是可以省略不写的.

    @Test fun testForOneExpr() {
        // 只有一个语句, 可以省略花括号
        for(a in 1..10)
            println(a)

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

range 有很多形式, 1..10 这种是最常用的, 还有例如 10 downTo 1, 1..10 step 3
等各种用法, 满足各种循环需求

for 循环数组类型

有三种形式

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

    }
  1. 循环里面的索引
    @Test fun testForArrayIndex() {
        val names = arrayOf("aaa", "bbb", "ccc")
        // 数组的 indices 属性会返回一个 IntRange
        for(index in names.indices)
            println(names[index])
    }
  1. 两个一起循环
    @Test fun testForArrayIndexItem() {
        val names = arrayOf("aaa", "bbb", "ccc")
        for((index, item) in names.withIndex())
            println("第 ${index + 1} 个名字是 $item")
    }

(index, item) in names.withIndex() 这种语法你可能会比较陌生, 其实这是一种解构
赋值. withIndex() 返回一个可迭代的集合, 里面的元素是 IndexedValue
类型, 这是一个数据类, 而数据类已经默认实现解构赋值了.

解构赋值的详细知识点以后会讲到.

while

whiledo while 跟 java 中的没区别.

回到目录

你可能感兴趣的:(流程控制)