条件分支
条件分支是最简答的控制语句,主要包括两路分支和多路分支,我们一起探索下Kotlin给条件分支带来了哪些变化
简单条件分支
直接上代码:
var i = 0
textView.text = "开关"
//类似Java写法
btnClick.setOnClickListener {
if (i % 2 == 0)
textView.text = "关"
else
textView.text = "开"
//每次自增
i++
}
//上面写法与Java相同,Kotlin简洁到可以像三元运算符一样,直接赋值
btnClick.setOnClickListener {
textView.text = if (i % 2 == 0) "关" else "开"
i++
}
Kotlin两路分支,可以直接像三元运算符那样赋值操作,所以Kotlin不再支持三元运算符,即if/else已经取代了三。
多路分支
switch/case
是最常用的多路分支,可惜它case数据类型存在局限,所以Kotlin推出了新的关键字when/else
。
when/else 与swtich/case 相比差别如下:
- 关键字switch被when取代
- 判断语句“case 常量值:”被新语句“常量值->”取代
- 取消break,Kotlin默认一个分支处理完成后就直接跳出多路语句,所以不再需要break
- 关键字default被else取代
when/else做了哪些升级:
- Java中case后面只可以跟着常量,而kotlin也可以支持变量
- Java中case后面只可以跟一个常量,遇到多种条件执行统一操作,只能多个case竖排不写break,最后一个时再写break,俗称:穿刺。而Kotlin中一个判断语句可以支持多个常量,当常量是连续值时可以使用in 开始值…结束值指定区域范围;若要求不在某个区域,则使用! in start…end
var count = 0
btnClick.setOnClickListener {
when (count) {
0 -> textView.text = "单曲循环"
1 -> textView.text = "随机播放"
2 -> textView.text = "顺序播放"
else -> textView.text = "默认模式"
}
count = (count + 1) % 3
}
//或者更简洁的写法
btnClick.setOnClickListener {
textView.text = when (count) {
0 -> "单曲循环"
1 -> "随机播放"
2 -> "顺序播放"
else -> "默认模式"
}
count = (count + 1) % 3
}
//Java中只允许常量跟在case后面,Kotlin还允许变量
var cond1: Int = 0
var cond2: Int = 2
var cond3: Int = 2
btnClick.setOnClickListener {
textView.text = when (count) {
cond1 -> "单曲循环"
cond2 -> "随机播放"
cond3 -> "顺序播放"
else -> "默认模式"
}
count = (count + 1) % 3
}
//注意:cond3与cond2重复了,cond3永远无法进入,提前被cond2拦截了
var age = 1
btnClick.setOnClickListener {
textView.text =
when (age) {
1, 2, 3, 4, 5 -> "学前儿童"
in 6..12 -> "青少年"
in 13..22 -> "青年"
!in 60..99 -> "油腻中年"
else -> "世纪老人您好!"
}
age += 3
}
类型判断
when/else 不仅可以判断变量值,还可以判断变量类型,Java中常见instanceOf
,在Kotlin中被is
取代了。如if(str is String){ }
,在when/else中 用is 变量名 - >
这种形式作为判断语句。
var countType: Number
var count = 0
btnClick.setOnClickListener {
count = (count + 1) % 3
countType = when (count) {
0 -> count.toLong()
1 -> count.toFloat()
else -> count.toDouble()
}
textView.text = when (countType) {
is Long -> "Long类型"
is Float -> "Float类型"
is Double -> "Double类型"
else -> "Number类型"
}
}
循环处理
遍历循环
在Kotlin容器那一篇文章讲过三四种遍历,唯独没见for(初始 ; 条件 ; 增减)
,why?因为Kotlin取消了这种遍历模式,替换为for(i in list.indices){ }
,其中indice为下标数组,i为下标,依次取出。
Java中有for (String item : list)
,而在Kotlin中:被 in 替换变成了for (item in list)
。
条件循环
取消for(初始 ; 条件 ; 增减)
是有代价的,好多场景是for(i in list.indices){ }
无法处理的,例如,如何设定条件判断的起始值?每次循环步长增量不是1怎么办?循环方向递减呢?
针对以上情况,Kotlin给出了几种解决办法,例如增加关键字until,step,downTo等;
//左闭右开 [6,14),表示包含6,但不包含14
for (i in 6 until 14) {
}
//[11,50]但是步长为4,每次递增4,不是1
for (i in 11..50 step 4) {
}
//从20到0递减循环
for (i in 20 downTo 0) {
}
但是尽管增加了关键字,但是并不完美。并且还增加了脱发风险,好在还有while,Kotlin的while和do/while与Java完全一致。
跳出多重循环
Java中有多重循环时候,如果跳出,需要一层层加条件的去break。Kotlin支持一步到位跳出多层循环,“break@标记”
var i = 2
tag@ while (i > 1) {
i++
while (i > 5) {
i += 3
if (i >= 20) break@tag
}
}