Kotlin 学习之逻辑控制

262 阅读3分钟

程序执行语句主要分为3种:顺序语句、条件语句和循环语句。

条件语句

Kotlin 种的条件语句主要有两种实现方式:if 和 when。

if 条件语句

Kotlin 中的 if 语句和 Java 中的 if 语句几乎没有任何区别。举例:

fun largerNumber(num1: Int, num2: Int): Int {
    var value = 0
    if (num1 > num2) {
        value = num1
    } else {
        value = num2
    }
    return value
}

Kotlin 中的 if 语句相比于 Java 的不同是它是可以有返回值的,返回值就是 if 语句每一个条件中最后一行代码的返回值。因此,上面代码可以简化为如下:

fun largerNumber(num1: Int, num2: Int): Int {
    val value = if (num1 > num2) {
        num1
    } else {
        num2
    }
    return value
}

此处 if 语句每个条件的最后一行代码作为返回值,并赋值给了 value 变量。由于现在没有重新赋值的情况了,所以可以使用 val 关键字来声明 value 变量。
可以发现 value 其实也可以省略:

fun largerNumber(num1: Int, num2: Int): Int {
    return if (num1 > num2) {
        num1
    } else {
        num2
    }
}

当函数只有一行代码时,可以省略函数体部分,直接讲这一行代码使用等号连接在函数定义的尾部:

fun largerNumber(num1: Int, num2: Int): Int = if (num1 > num2) {
    num1
} else {
    num2
}

if 中语句只有一条,大括号可以省略:

fun largerNumber(num1: Int, num2: Int): Int = if (num1 > num2) num1 else num2

when 条件语句

Kotlin中的 when 语句可以和 Java 中的 switch 比较。
相比于 Java 中 switch 只能传入整型或者短于整型的变量作为条件(JDK1.7之后增加了对字符串的支持),when 语句允许传入一个任意类型的参数。
首先看看 when 条件语句的使用:

fun getScore(name: String) = when (name) {
    "Tom" -> 86
    "Jim" -> 89
    "Lucy" -> 90
    else -> 0
}

when 语句和 if 语句一样也是可以有返回值的,因此仍然可以使用单行代码函数的语法糖。
可以概括 when 匹配执行的格式如下:

匹配值 -> { 执行逻辑 }

当你的执行逻辑只有一行代码时,{ } 可以省略。
除了精确匹配之外, when 语句还允许进行类型匹配,is 关键字是类型匹配的核心,相当于 Java 中的 instanceof 关键字。

fun checkNumber(num: Number) {
    when (num) {
        is Int -> println("number is Int")
        is Double -> println("number is Double")
        else -> println("number not support")
    }
}

when 语句还有一种不带参数的写法,这种写法是将判断的表达式完整的写在 when 的结构体当中:

fun getScore(name: String) = when {
    name.startsWith("Tom") -> 86
    name == "Jim" -> 90
    else -> 0
}

循环语句

Kotlin 中的循环语句和 Java 一样,也提供了 while 循环和 for 循环,while 循环和 Java 没有任何区别。所以我们重点关注 for 循环。
Kotlin 采用的是 for-in 循环,开始学习 for-in 循环之前,需要理解一个区间的概念:

val range = 0..10

使用 .. 表示 range 是一个0到10的闭区间,[0,10]

val range = 0 until 10

使用 until 关键字表示 range 是一个0到10的左闭右开的区间,[0,10)

val range = 10 downTo  0

使用 downTo 关键字表示 range 是一个10到0的降序区间,[10,0]。
for-in 循环的语法如下:

for (i in 0..10) {
    println(i)
}

使用 step 关键字指定步长的数字:

for (i in 0 until 10 step 2) {
    println(i)
}

for-in 循环除了可以对区间遍历外,还可以用于遍历数组和集合。