Control condicional de Kotlin
Expresión IF
Una declaración if contiene una expresión booleana y una o más declaraciones.
// 传统用法
var max = a
if (a < b) max = b
// 使用 else
var max: Int
if (a > b) {
max = a
} else {
max = b
}
// 作为表达式
val max = if (a > b) a else b
También podemos asignar el resultado de una expresión IF a una variable.
val max = if (a > b) {
print("Choose a")
a
} else {
print("Choose b")
b
}
Esto también demuestra que no necesitamos un operador ternario como en Java, porque podemos usarlo para implementarlo de manera simple:
val c = if (condition) a else b
Ejemplo
fun main(args: Array<String>) {
var x = 0
if(x>0){
println("x 大于 0")
}else if(x==0){
println("x 等于 0")
}else{
println("x 小于 0")
}
var a = 1
var b = 2
val c = if (a>=b) a else b
println("c 的值为 $c")
}
El resultado es:
x 等于 0 c 的值为 2
Usando rangos
Usa el operador `in` para detectar si un número está dentro de un rango especificado. El formato del rango esx..y :
Ejemplo
fun main(args: Array<String>) {
val x = 5
val y = 9
if (x in 1..8) {
println("x 在区间内")
}
}
El resultado es:
x 在区间内
Expresión when
`when` compara su argumento con todas las condiciones de las ramas en orden, hasta que alguna rama cumple la condición.
`when` puede usarse tanto como expresión como como declaración. Si se usa como expresión, el valor de la rama que cumple la condición es el valor de toda la expresión. Si se usa como declaración, se ignoran los valores de las ramas individuales.
`when` es similar al operador `switch` de otros lenguajes. Su forma más simple es la siguiente:
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> { // 注意这个块
print("x 不是 1 ,也不是 2")
}
}
En `when`, `else` equivale al `default` de `switch`. Si ninguna otra rama cumple la condición, se evaluará la rama `else`.
Si muchas ramas necesitan procesarse de la misma manera, se pueden agrupar varias condiciones de rama, separadas por comas:
when (x) {
0, 1 -> print("x == 0 or x == 1")
else -> print("otherwise")
}
También podemos comprobar si un valor está (`in`) o no está (`!in`) en un rango o colección:
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")
}Otra posibilidad es comprobar si un valor es (`is`) o no es (`!is`) de un tipo específico. Nota: gracias a la conversión inteligente (smart cast), puedes acceder a los métodos y propiedades de ese tipo sin ninguna comprobación adicional.
fun hasPrefix(x: Any) = when(x) {
is String -> x.startsWith("prefix")
else -> false
}
`when` también puede usarse para reemplazar una cadena `if-else if`. Si no se proporciona un argumento, todas las condiciones de las ramas son expresiones booleanas simples, y cuando la condición de una rama es verdadera, se ejecuta esa rama:
when {
x.isOdd() -> print("x is odd")
x.isEven() -> print("x is even")
else -> print("x is funny")
}
Ejemplo
fun main(args: Array<String>) {
var x = 0
when (x) {
0, 1 -> println("x == 0 or x == 1")
else -> println("otherwise")
}
when (x) {
1 -> println("x == 1")
2 -> println("x == 2")
else -> { // 注意这个块
println("x 不是 1 ,也不是 2")
}
}
when (x) {
in 0..10 -> println("x 在该区间范围内")
else -> println("x 不在该区间范围内")
}
}
Resultado:
x == 0 or x == 1 x 不是 1 ,也不是 2 x 在该区间范围内
Uso en `when`inOperador para comprobar si una colección contiene una instancia determinada:
fun main(args: Array<String>) {
val items = setOf("apple", "banana", "kiwi")
when {
"orange" in items -> println("juicy")
"apple" in items -> println("apple is fine too")
}
}
Resultado:
apple is fine tooOtras extensiones