逻辑控制(二)

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
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值