驽马十驾 驽马十驾

驽马十驾,功在不舍

目录
Kotlin系列:when的用法汇总
/  

Kotlin系列:when的用法汇总

开篇

when类似javaswitch不过从语法上来说,更简单。

  • 不需要 break 。从上倒下一旦匹配到了,就返回
  • swtich支持更多的类型。

接下来通过常用的用法来看看基本的用法

  • 左边的表达式应该返回的是一个 boolean
  • 通过 -> 来分割判定和行为
  • 不需要加break,一旦匹配到就返回。

案例讲解

案例1

下述代码判定了一个数如果是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 的语法,不过因为少了很多括号和语法细节,可读性更强

案例2

搭配枚举使用

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,但是不够优雅
  • 但是当输入的参数多余1个的时候,只能使用2这种写法,比如下面例子
//如果多个参数,只能把参数写到外面了
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") //可以省略的
}

案例3

搭配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 的常用用法,应该就这么多了,后面还发现了,继续补充。

不积跬步,无以至千里。不积小流,无以成江海。