前言
程序的执行语句主要分为3种:顺序语句、条件语句和循环语句。顺序语句比较容易理解,就是将代码按照顺序一行一行的往下执行即可,但是这种执行方式在很多情况下并不能瞒住我们的编程需求,这时就需要引入条件语句和循环语句啦。
Kotlin中的条件语句主要有两种实现方式:if和when。
一、if条件语句
如果我们需要实现返回两个数中的最大值,这时我们可以不使用Kotlin中自带的max(),我们可以通过if条件语句轻松实现这个功能,代码如下:
fun maxNumber(num1:Int , num2:Int):Int {
var value = 0
if (num1 > num2) {
value = num1
} else {
value = num2
}
return value
}
Kotlin中的if语句相比于Java有一个额外的功能,它是可以有返回值的,返回值就是if语句每一个条件中最后一行代码的返回值。因此可以将上述代码进行简化,代码如下:
//简化版
fun maxNumber(num1:Int , num2:Int):Int {
var value = if(num1 > num2){
num1
}else {
num2
}
return value
}
仔细观察上述代码,你会发现value其实也是一个多余的变量,我们可以直接将if语句的返回值返回,这样代码会变得更加简洁,代码如下:
// 超级简化版
fun maxNumber(num1:Int , num2:Int):Int {
return if (num1 > num2) {
num1
} else {
num2
}
}
到这里为止,你是否觉得代码已经足够简洁了吗?但是如果使用语法糖可以使代码更加简洁,因为这个函数只有一行代码,我们可以省略函数体部分,直接将这一行代码使用等号串连在函数定义的尾部。代码如下:
//至尊简化版
fun maxNumber(num1: Int, num2: Int): Int = if (num1 > num2) {
num1
} else {
num2
}
Kotlin中的语法糖不仅可以用到函数,同样可以用到if语句中,如果你愿意同样也可以将上述代码直接压缩成一行代码,代码如下:
// 一行版
fun maxNumber(num1: Int, num2: Int): Int = if (num1 > num2) num1 else num2
二、when条件语句
Kotlin中的when语句有点类似于Java中的switch语句,但它又比switch语句强大的多。如果熟悉Java的话,应该知道Java中的switch语句并不怎么好用。首先,switch只能传入整型或短于整型的变量作为条件,如果你的判断逻辑并非是上述几种类型的变量,那么不好意思,switch并不适合你。而Kotlin中的when语句不仅解决了上述痛点,还增加了许多功能更为强大的新特性,有时候它比if语句还要简单好用。
接下来让我们编写一个查询考试成绩的功能,输入一个学生的姓名,返回该学生考试的分数。首先使用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
}
}
上述代码定义了一个getScore()函数,这个函数接收一个学生姓名参数,然后通过if判断找到该学生对应的考试分数并返回。虽然上述代码可以实现我们想要的功能,但是写了那么多的if和else,这会使得代码很冗余。现在我们可以将代码用when修改成如下形式:
fun getScore(name: String) : Int = when (name) {
"Tom" -> 86
"Jim" -> 89
"Bob" -> 68
"Jack" -> 79
else -> 0
}
when语句允许传入一个任意类型的参数,然后可以在when的结构体中定义一系列的条件,格式是:
匹配值 -> {执行逻辑}
当然如果我们不在when语句中传入参数的话,还可以进行如下改写:
fun getScore(name: String) = when {
name == "Tom" -> 86
name == "Jim" -> 77
name == "Jack" -> 95
name == "Lily" -> 100
else -> 0
}
可能你会觉得这种无参数的when语句写起来比较冗余,但有些场景必须使用这种写法才能实现。举个例子,假设所有已Tom开头的人,他的分数都是86分,这种场景用带参数的when就无法实现,而使用不带参数的when语句就可以这样写:
fun getScore(name:String)=when{
name.startsWith("Tom")->86
name == "Jim" -> 77
name == "Jack" -> 95
name == "Lily" -> 100
else ->0
}
除了精确匹配外,when语句还允许进行类型匹配。接下来使用一个例子来演示类型匹配。如下所示:
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关键字。由于checkNumber()函数接收一个Number类型的参数,这是Kotlin中内置的抽象类,想Int、Long、Float、Double等与数字有关的类都是它的子类,所以这里就可以使用类型匹配来判断传入的参数到底是属于什么类型,如果是Int型或Double型,就将该类型打印出来,否则就打印不支持该参数的类型。
注意,Kotlin中判断字符串或对象是否相等可以直接使用==关键字,而不用像Java那样调用equals()方法。
二、循环语句
熟悉Java的人应该知道,Java中主要有两种循环语句:while循环和for循环,而Kotlin也提供了while循环和for循环,其中while循环不管在语法还是使用技巧上都和Java十分类似。这里直接记录一下for循环的使用方法。
Kotlin在for循环方面做了很大幅度的修改,Java中最常用的就是for-i循环在Kotlin中直接被舍弃了,而Java中另一种for-each循环则被Kotlin进行了大幅度的加强,变成了for-in循环。在学习for-in循环之前,先要普及给一个区间的概念,因为这是Java中没有的东西。我们可以使用如下Kotlin代码来表示一个区间:
val range = 0..10
上述代码表示创建了一个-到10的区间,并且两端都是闭区间,这意味着0到19这两个端点都是包含在区间中的,用数字表示出来就是[0,10].
有了区间以后,我们就可以通过for - in循环来遍历这个区间,比如在main()中编写如下代码:
// 循环语句
fun main() {
for (i in 0..10) {
println(i)
}
}
但是很多情况下,双端闭区间却不如单端闭区间好用。为什么这么说呢?相信你一定知道数组的下标都是从0开始的,一个长度为10的数据,它的下标区间范围是0到9,因此左闭右开的区间在程序设计中更加常用。Kotlin中可以使用until关键字创建一个左闭右开的区间,如下所示:
val range = 0 until 10
默认情况下,for -in 循环每次执行循环时会在区间范围内递增1,相当于Java for-i循环中i++的效果,如果你想跳过其中的一些元素可以使用step关键字:
fun main() {
for (i in 0 until 10 step 2){
println(i)
}
}
上述代码表示在遍历[0,10)这个区间的时候,每次执行循环都会在区间范围内递增2,相当于for - i循环中i = i+2的效果。
不过前面学习的. .和until关键字都要求区间的左端必须小于等于区间的右端,也就是这两种关键字创建的都是一个升序的区间。如果你想创建一个降序的区间,可以使用downTo关键字,用法如下:
fun main() {
for (i in 10 downTo 1){
println(i)
}
}
这里我们创建了一个[10,1]的降序区间。