Kotlin从入门到放弃 第二节 Kotlin中的判断语句

第二节 Kotlin中的判断语句

一 、if判断语句

首先学习一下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判断语句

接下来我们开始学习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要灵活很多,还是要多加联系。

你可能感兴趣的:(Kotlin从入门到放弃,kotlin,android)