在编程中,程序的执行语句主要分为三种类型:顺序语句、条件语句和循环语句。顺序语句简单明了,代码按顺序一行行执行。然而,在许多情况下,我们需要更复杂的逻辑控制来满足特定的需求,这时就需要使用条件语句和循环语句。
- if 条件语句
 
Kotlin 中的 if 语句与 Java 中的 if 语句非常相似。下面以之前提到的 largerNumber() 函数为例,展示如何使用 if 语句来返回两个参数中的较大值。
fun largerNumber(num1: Int, num2: Int): Int { var value = 0 if (num1 > num2) { value = num1 } else { value = num2 } return value 
} 
返回值功能
Kotlin 中的 if 语句可以有返回值,返回值是每个条件分支的最后一行代码的结果。因此,上面的代码可以简化如下:
fun largerNumber(num1: Int, num2: Int): Int { val value = if (num1 > num2) { num1 } else { num2 } return value 
} 
这里我们将 if 语句的结果直接赋值给 value 变量,并且由于不再需要重新赋值,可以使用 val 关键字来声明 value。
进一步简化
事实上,value 变量也是多余的,可以直接将 if 语句的返回值作为函数的返回值:
fun largerNumber(num1: Int, num2: Int): Int { return if (num1 > num2) { num1 } else { num2 } 
} 
使用语法糖
当一个函数只有一行代码时,可以省略函数体部分,直接将这一行代码放在等号后面。尽管上述代码看起来不止一行,但它的作用实际上是一样的,符合这种语法糖的使用条件。因此,我们可以继续简化代码:
fun largerNumber(num1: Int, num2: Int) = if (num1 > num2) { num1 
} else { num2 
} 
最后,如果愿意,还可以将代码压缩成一行:
fun largerNumber(num1: Int, num2: Int) = if (num1 > num2) num1 else num2 
通过这些简化步骤,我们可以看到 Kotlin 如何利用其简洁的语法特性使代码更加清晰和高效。
Kotlin 中的 when 条件语句
 
今天我们将深入学习 Kotlin 中的 when 语句,并将其与 Java 中的 switch 语句进行对比。
为什么选择 when?
 
Java 中的 switch 语句虽然基本能满足需求,但也存在一些限制和不便:
- 支持类型有限:Java 的 
switch语句最初只支持整型(如int,short,byte,char),后来扩展到了字符串(从 JDK 7 开始)。但对于其他类型的变量,switch就无能为力了。 - 需要显式 break:每个 
case必须显式地使用break语句来结束,即执行完一个case后继续执行下一个case。这很容易导致意外错误。 - 表达能力有限:Java 的 
switch语句主要用于简单的等值判断,无法处理复杂的逻辑条件。 
相比之下,Kotlin 的 when 语句更加灵活和强大,以下是其主要特点:
- 支持任意类型:
when语句可以接受任何类型的参数,不仅限于整型或字符串。 - 无需显式 break:
when语句默认不会 fall-through,每个分支只会执行一次。 - 支持复杂条件:除了等值判断外,
when还可以处理范围、类型匹配等多种复杂条件。 
接下来,我们通过具体的例子来详细学习如何使用 when 语句。
使用 when 实现查询考试成绩
 
假设我们要编写一个函数 getScore,根据学生的姓名返回他们的考试分数。首先,我们用之前学过的 if 语句来实现这个功能:
fun getScore(name: String) = if (name == "Tom") { 86 
} else if (name == "Jim") { 77 
} else if (name == "Jack") { 95 
} else if (name == "Lily") { 100 
} else { 0 
} 
这段代码虽然实现了所需的功能,但由于多个 if-else 结构的存在,显得有些冗长和不够简洁。
引入 when 语句
 
我们可以使用 when 语句来简化这段代码:
fun getScore(name: String) = when (name) { "Tom" -> 86 "Jim" -> 77 "Jack" -> 95 "Lily" -> 100 else -> 0 
} 
 
可以看到,when 语句使代码变得更加简洁明了。每个条件分支以箭头 -> 分隔,直接返回相应的结果。此外,when 语句也可以有返回值,因此我们可以继续使用单行代码函数的语法糖。
类型匹配
除了精确匹配外,when 语句还支持类型匹配。例如,定义一个 checkNumber 函数来判断传入参数的类型:
fun checkNumber(num: Number) { when (num) { is Int -> println("number is Int") is Double -> println("number is Double") else -> println("number not support") } 
} 
在这个例子中,is 关键字用于检查变量是否属于某个特定类型,类似于 Java 中的 instanceof 操作符。由于 Number 是一个抽象类,而 Int、Double 等都是它的子类,因此可以很方便地进行类型匹配。
