Kotlin Note 3

Kotlin学习笔记3

表示和处理选择
  • 声明枚举类
//声明一个简单的枚举类
enum class Color{
    RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET
}

和Java一样,枚举并不是值的列表:可以给枚举类声明属性和方法。

  • when
    在Kotlin中,when对应的就是Java中的switch。和if相似,when是一个有返回值的表达式,因此可以写一个直接返回when表达式的表达式函数:
fun getMnemonic(color: Color) = 
    when (color) {
        Color.RED -> "Richard"
        Color.ORANGE -> "Of"
        Color.YELLOW-> "York"
        Color.GREEN-> "Gave"
        Color.BLUE-> "Battle"
        Color.INDIGO-> "In"
        Color.VIOLET-> "Vain"

    }

根据传进来的Color值找到对应的分支,不需要在每个分支都写上break。

when比switch强大得多可以体现在:when允许使用任何对象作为分支条件:

//when分支中使用不同的对象
fun mix(c1: Color. c2: Color) = 
    when (setOf(c1, c2)){
        setOf(RED, YELLOW) -> ORANGE
        setOf(YELLOW, BLUE) -> GREEN
        setOf(BLUE, VIOLET) -> INDIGO
        else -> throw Exception ("Dirty color")
    }

when表达式把他的实参依次和所有分支匹配,直到某个分支满足条件。使用任何表达式做when的分支条件,可以使代码看起来很简洁。

上述代码还可以写成不带参数的when,如下:

fun mix2(c1: Color, c2: Color) =
    when{
        (c1 == RED && c2 == YELLOW) ||
        (c1 == YELLOW && c2 == RED)  ->
        ORANGE

        (c1 == YELLOW && c2 == BLUE) ||
        (c1 == BLUE && c2 == YELLOW)  ->
        GREEN

        (c1 == BLUE && c2 == VIOLET) ||
        (c1 == VIOLET && c2 == BLUE)  ->
        ORANGE
    else -> throw Exception("Dirty color")
    }

mix2和mix函数所做的事情一样,不过这种写法的优点是不会创建额外的对象,但是比较更难理解。

  • 重构:用“when”代替“if”
fun eval (e: Expr): Int = 
    if(e is Num){
        e.value
    }else if(e is Sum) {
        eval(e.right) + eval(e.left)
    }else{
    throw IllegalArgumentException("Unknown experssion")
    }

如果if分支中只有一个表达式,花括号是可以省略的。如果if分支是一个代码块代,码块中的最后一个表达式会被作为结果返回。接下来用when来重写:

fun eval (e: Expr): Int = 
    when(e){
        is Num ->
            e.value
        is Sum ->
            eval(e.right) + eval(e.left)
    else ->
    throw IllegalArgumentException("Unknown experssion")
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值