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")
}