首先学习一下if, Kotlin中的if和java中的if几乎没有什么区别。
先举一个列子:
fun maxNumber(number1: Int, number2: Int): Int {
var maxNumber = 0
if (number1 > number2) {
maxNumber = number1
} else {
maxNumber = number2
}
return maxNumber
}
这段代码不需要过多的说明,只要是有一点编程基础都可以看懂。 现在看起来和java中的if是一样的,但是前面说的“几乎没有”什么区别,所以还是有区别的。接下来看下不一样的地方。
在Kotlin中if语句是可以有返回值的,这个返回值就是if语句每个条件中的最后一行代码。因此我们可以简化一下代码。
fun maxNumber(number1: Int, number2: Int): Int {
var maxNumber = if (number1 > number2) {
number1
} else {
number2
}
return maxNumber
}
仔细观察上面的代码,可以发现maxNumber是一个多余的变量,因为我们可以通过if直接返回 :
fun maxNumber(number1: Int, number2: Int): Int {
return if (number1 > number2) {
number1
} else {
number2
}
}
到这里我们的代码看起来精简很多了,但实际上我们还可以做的更好
fun maxNumber(number1: Int, number2: Int): Int = if (number1 > number2) {
number1
} else {
number2
}
这里涉及到Kotlin中的一个语法,那就是当函数只有一行代码的时候,我们可以不写函数体,可以直接将唯一的一行代码写在定义函数的尾部,中间使用等号连接。这个if看起来有很多行,其实我们可以将其变成一行代码:
fun maxNumber(number1: Int, number2: Int): Int = if (number1 > number2) number1 else number2
怎么样,通过一个简单的if,就可以发现Kotlin中这么有意思的语法特性,这也是Kotlin吸引我的原因之一。
接下来我们开始学习when。Kotlin中的when有点像java中的switch,但是又比他强大很多。
如果有熟悉java的小伙伴,应该知道java中的switch并不是很好用。第一,switch只能传入整型或短于整型的变量做为条件,JDK1.7之后增加了对字符串的支持,但是如果我们的判断类型不是上面的两种的话,那么不好意思!!!switch并不能帮到我们。第二,switch中的每个case都加break。否则就会造成穿透的问题。这个问题导致过很多奇怪的bug,在经过漫长的排查发下没有在结尾加上break,顿时感觉自己是一个大怨种。
但是!!!请看Kotlin为我们提供的when,他不仅解决上面的问题,还添加了很多更为强大的特性,在有些时候他甚至比if还要好用。好了话不多说直接上代码:
fun getMoney(name: String) = if (name == "ZhanSan") {
10000
} else if (name == "LiSi") {
15000
} else if (name == "WangWu") {
20000
} else if (name == "XiaLuo") {
500
}
这里写了一个输入名字获取对应存款的函数,这是用上面学习的if来实现的这个功能,可以看到我们写了很多的if else 又没觉得很多余? 那么我在对比一下用when实现这个功能的代码
fun getMoney(name: String) = when (name) {
"ZhanSan" -> 10000
"LiSi" -> 15000
"WangWu" -> 20000
"XiaLuo" -> 500
else -> 0
}
怎么样?是不是瞬间感觉清爽了很多,另外when和if是一样的 也是可以有返回值的。
when语句允许传入一个任意类型的参数,然后可以在when的结构体系种定义种种条件,格式是: 匹配值 -> {执行逻辑} 同样当只有一行代码时 {} 可以省略。除了精准匹配之外,when还可以匹配类型,举个例子:
fun checkNumber(num: Number) {
when(num) {
is Int -> Log.i("TAG", "number is Int")
is Double -> Log.i("TAG", "number is Double")
}
}
上面的代码中 is 就是类型匹配的核心,他和java中的instanceof关键字相似。可以看到上面的函数接收的参数是一个Number类型,这是Kotlin内置的一个抽象类,像Int,Long,Float,Double 等与数字相关的类都是他的子类。所以这里就可以判断传入数字的类型,并且通过log打印出来。
when的基本用法就是这些,但when还有一种不带参数的用法,这种用法可能不常用,但有时候却能发挥出很强的扩展性
拿上面的getMoney()函数举个例子,如果我们不在when中传入参数的话,可以写成这样:
fun getMoney(name: String) = when {
name == "ZhanSan" -> 10000
name == "LiSi" -> 15000
name == "WangWu" -> 20000
name == "XiaLuo" -> 500
else -> 0
}
可以看到,这种用法时将判断的表达式完整的写在when的结构体当中。注意,Kotlin中判断字符串或对象是否相等可以直接使用 “==”。 可能你会觉得上面的那种方式比较冗余,假设所有姓李的人都没有存款,这种情况就只能使用不带参数的when:
fun getMoney(name: String) = when {
name.startsWith("Li") -> 0
name == "ZhanSan" -> 10000
name == "WangWu" -> 20000
name == "XiaLuo" -> 500
else -> 0
}
现在无论你叫LiSi,还是LiKui只要是Li开头你的存款就是0。
这就Kotlin中的判断语句,比起java中的if和switch要灵活很多,还是要多加联系。