when表达式
fun describe(obj: Any): String =
when (obj) {
1 -> "One"
"Hello" -> "Greeting"
is Long -> "Long"
!is String -> "Not a string"
else -> "Unknown"
}
when语句会顺序的比对所有分支是否满足条件直到找到合适的分支满足条件。when语句可以被用作表达式或声明。如果被用作表达式,那么满足条件的分支的值就是全部表达式的值;如果被用作声明,每个分支的值将被忽略(就像if语句,每个分支可以是代码块,它的值就是最后一个表达式的值)。
else分支将会执行如果其他的分支都没满足条件。如果when被用作表达式,else分支将是强制性的,除非编译器可以证明所有可能的分支已经被覆盖。
如果许多分支处理的结果是一样的,那么可以使用逗号来分隔,如下:
when (x) {
0, 1 -> print("x == 0 or x == 1")
else -> print("otherwise")
}
我们可以使用任意的表达式而不仅仅是常量作为分支条件。
when (x) {
parseInt(s) -> print("s encodes x")
else -> print("s does not encode x")
}
我们可以检查一个值是否在某个范围或集合中。
when (x) {
in 1..10 -> print("x is in the range")
in validNumbers -> print("x is valid")
!in 10..20 -> print("x is outside the range")
else -> print("none of the above")
}
另外也可以检查一个值是否是某种特定的类型,需要注意的是,由于自动转换,在满足条件的分支你可以直接访问转换后对象的方法和属性,而不需要任何额外的检查。
val hasPrefix = when(x) {
is String -> x.startsWith("prefix")
else -> false
}
when可以用来替换if-else-if语句。如果没有提供参数,那么分支条件就是简单的布尔表达式,并且如果某个分支的布尔表达式的值为true,那么将执行该分支。
when {
x.isOdd() -> print("x is odd")
x.isEven() -> print("x is even")
else -> print("x is funny")
}