when 条件语句
Java 中的 switch 语句只能传入整型或短于整型的变量作为条件,JDK 1.7 之后增加了对字符串变量的支持,但如果你的判断逻辑使用的并非是上述几种类型的变量,Java 就无法支持了。其次 switch 中的每个 case 条件都要在最后主动加上一个 break,否则就会继续执行下一个 case 语句,这一特性导致许多奇怪的 bug。
Kotlin 中的 when 语句不仅解决了上述痛点,还增加了许多更为强大的新特性
when 语句允许传入一个任意类型的参数,然后可以在 when 的结构体中定义一系列的条件,格式如下:
when (要进行匹配参数) {
匹配逻辑
}
// 当匹配逻辑只有一行代码时,{} 可以省略
实现查询考试成绩的功能
输入一个学生的姓名,返回该学生考试的分数
if 语句实现
fun getScore(name: String) = if (name == "a") {
80
} else if (name == "b") {
81
} else if (name == "c") {
77
} else if (name == "x") {
27
} else {
0
}
when 实现
当判断条件非常多的时候,就应该考虑使用 when 语句了,when 语句也可以有返回值
fun getScore1(name: String) = when (name) {
"a" -> 80
"b" -> 81
"c" -> 77
"x" -> 27
else -> 0
}
类型匹配
除了精确匹配,when 语句还允许进行类型匹配,例如:
fun checkNum (num: Number) {
when (num) {
is Int -> println("is Int")
is Double -> println("is Double")
else -> println("do not know")
}
}
/**
* 其中 is 关键字是类型匹配的核心
* 它相当于 Java 中的 instanceof 关键字
* Number 是 Kotlin 中的一个抽象类,像 Int、Long、Float、Double 等与数学相关的类都是它的子类
*/
不带参数的 when 语句
虽然不常用,但有时候却能发挥很强的扩展性
上面 getScore() 函数,如果不在 when 语句中传入参数的话,可以这样写:
fun getScore2(name: String) = when {
name == "a" -> 80
name == "b" -> 81
name == "c" -> 77
name == "x" -> 27
else -> 0
}
/**
* 可以看出不带参数的 when 语句其实是将判断的表达式完整地写在结构体中
* 在 Kotlin 中,判断字符串或者对象是否相等可以直接使用 == 关键字,不用像 Java 那样使用 equals() 方法
*/
看起来无参数的 when 语句有些冗余,但是有些场景必须这样写才能实现。例如,还是 getScore() 函数,假设现在有多个名字以 c 开头的人,他们的分数都是 77 分,像这样的场景,就需要使用无参数的 when 语句来实现
fun getScore3(name: String) = when {
name == "a" -> 80
name == "b" -> 81
name.startsWith("c") -> 77
name == "x" -> 27
else -> 0
}