在编程中,程序的执行语句主要分为三种类型:顺序语句、条件语句和循环语句。顺序语句简单明了,代码按顺序一行行执行。然而,在许多情况下,我们需要更复杂的逻辑控制来满足特定的需求,这时就需要使用条件语句和循环语句。
- 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
等都是它的子类,因此可以很方便地进行类型匹配。