今天,我们来学习一下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
关键字的其他使用场景。