Kotlin系列之when关键字

今天,我们来学习一下Kotlin的when关键字。

when关键字是一个有返回值的表达式,也就是它可以返回一个值。下面说说它的各种用法。

when处理枚举类

在Java中我们一般使用switch来处理枚举类,比如我想对每一种枚举值返回一个结果,就可以使用switch来处理。这种处理的需求在Kotlin中使用when关键字来完成。下面是具体的代码。

Kotlin枚举类

enum class ColorEnum(val r: Int, val g: Int, val b: Int, val colorName: String){
    RED(255, 255, 255, "红色"), GREEN(0, 255, 0, "绿色"),
    BLUE(0, 0, 255, "蓝色");
}
复制代码

Java使用switch处理枚举类

public int getValue(ColorEnum colorEnum){
    int value = 0;
    switch (colorEnum){
        case RED:
            value = 1;
            break;
        case BLUE:
            value = 2;
            break;
        case GREEN:
            value = 3;
            break;
    }
    return value;
}
复制代码

Kotlin使用when处理枚举类

fun getValue(colorEnum: ColorEnum) = 
    when(colorEnum){
        ColorEnum.RED -> 1;
        ColorEnum.BLUE -> 2;
        ColorEnum.GREEN -> 3;
    }
复制代码

是不是简洁了很多,当枚举常量匹配时,返回对应的箭头后面的值。由于这里when是表达式,有返回值。同时这里的类型推导也可以让我们不需要显式指定函数返回值类型。 同时上面的代码不需要写break,当我们需要多个匹配项目返回同一个值时,我们可以这样写。

Kotlin多个匹配项目返回同一个值

fun getValue2(colorEnum: ColorEnum) =
    when(colorEnum){
        ColorEnum.RED, ColorEnum.BLUE -> 1;
        ColorEnum.GREEN -> 3;
    }
复制代码
when匹配任意对象

Java中的switch的分支条件必须是枚举常量字符串数字值。而Kotlin中的when可以使用任何对象,我们这里举一个简单的颜色混合的例子来说明。

Kotlin代码

fun mix(color1: ColorEnum, color2: ColorEnum) =
        when(setOf<ColorEnum>(color1, color2)){
            setOf(ColorEnum.RED, ColorEnum.GREEN) -> "黄色"
            setOf(ColorEnum.RED, ColorEnum.BLUE) -> "紫色"
            setOf(ColorEnum.BLUE, ColorEnum.GREEN) -> "黑色"
            else -> throw Exception("不知道什么颜色")
        }
复制代码

上面的例子中的setOf()对应于Java里面的Set集合,它也是不关注其中元素的顺序。所以上面的枚举匹配时也不会关注于元素的顺序,只要其中的元素是匹配的即可。else分支等同于switch里面的default分支,当与所有项都不匹配时执行。

不带参数的when

我们注意到,上面的对象在比较时,必须要创建额外的集合对象,这在性能上会有一定的损失,这里我们使用另外一种方法实现上面同样的功能,同时避免额外的对象创建。

Kotlin代码

fun mix2(color1: ColorEnum, color2: ColorEnum) =
        when{
            (color1 == ColorEnum.RED && color2 == ColorEnum.GREEN) ||
            (color1 == ColorEnum.GREEN && color2 == ColorEnum.RED) -> "黄色"
            
            (color1 == ColorEnum.RED && color2 == ColorEnum.BLUE) ||
            (color1 == ColorEnum.BLUE && color2 == ColorEnum.RED) -> "紫色"
            
            (color1 == ColorEnum.BLUE && color2 == ColorEnum.GREEN) || 
            (color1 == ColorEnum.GREEN && color2 == ColorEnum.BLUE) -> "黑色"
            
            else -> throw Exception("不知道什么颜色")
        }
复制代码

虽然代码量有所增加,可读性也好像变差了一些,但是少了对象的创建,性能有所提升。

写在最后

上面的例子看出Kotlin的设计理念就是简洁明了,用更少的代码做更多的事,后续我们还会提到when关键字的其他使用场景。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值