when
类似java
的switch
不过从语法上来说,更简单。
break
。从上倒下一旦匹配到了,就返回swtich
支持更多的类型。接下来通过常用的用法来看看基本的用法
->
来分割判定和行为break
,一旦匹配到就返回。下述代码判定了一个数如果是3或者5的倍数或者包含3和5那么执行某些操作,否则输出自己。
fun check(num: Int) {
//这里重头戏开始
when {
num % 3 == 0 -> println("$num:pass")
num % 5 == 0 -> println("$num:pass")
num.toString().contains("3") or num.toString().contains("5") -> println("$num:pass")
else -> println(num)
}
}
fun main() {
for (i in 1..30) {
check(i)
}
}
此时的 when 更像 if和 else
的语法,不过因为少了很多括号和语法细节,可读性更强
搭配枚举使用
enum class DayOfWeek(val offset: Int) {
MON(1),
TUE(2);
//如果后面需要添加方法,那么上面的分号不可以忽略
fun offsetDay() = offset
}
//一个参数,这样的写法是很好的
fun oneDay1(dayOfWeek: DayOfWeek) = when (dayOfWeek) {
//默认的是 when(x)中的 x和表达式左边的等值匹配
DayOfWeek.MON -> println("today is monday,offset is ${dayOfWeek.offset}")
DayOfWeek.TUE -> print("today is tuesday,offset is ${dayOfWeek.offset}")
else -> println("unknown") //可以省略的
}
//如果有一个参数,更推荐上面的写法
fun oneDay2(dayOfWeek: DayOfWeek) = when {
dayOfWeek == DayOfWeek.MON -> println("today is monday,offset is ${dayOfWeek.offset}")
dayOfWeek == DayOfWeek.TUE -> print("today is tuesday,offset is ${dayOfWeek.offset}")
else -> println("unknown") //可以省略的
}
上述写法中,我们注意到了几点不同。
oneDay1
中的when后面有括号,语义上就是每一个条件和 when中的条件是否相等oneDay2
的写法等同oneDay1
,但是不够优雅//如果多个参数,只能把参数写到外面了
fun oneDay3(asFlag: Boolean, dayOfWeek: DayOfWeek) = when {
dayOfWeek == DayOfWeek.MON -> println("today is monday,offset is ${dayOfWeek.offset}")
dayOfWeek == DayOfWeek.TUE -> print("today is tuesday,offset is ${dayOfWeek.offset}")
asFlag -> "well weather"
else -> println("unknown") //可以省略的
}
搭配smart cast
来进行处理。
open class ITag
class ATag : ITag() {
fun sayA() = println("A")
}
class BTag : ITag() {
fun sayB() = println("B")
}
//类的第二种情况 + smart cast
fun tagTest(iTag: ITag) = when (iTag) {
is ATag -> iTag.sayA()
is BTag -> iTag.sayB()
else -> "unknown"
}
上述例子中有如下1个细节
is
关键字做了smart cast
就知智能转换关于 when 的常用用法,应该就这么多了,后面还发现了,继续补充。