En este tutorial aprenderás a cómo usar la expresión when
en Kotlin, con el fin de manipular el flujo de tus programas, a partir de varias entradas con sus respectivas condiciones.
when Como Sentencia
La expresión condicional when
te permite comparar el valor de un argumento (sujeto) contra una lista de entradas.
Las entradas tienen condiciones asociadas al cuerpo que se ejecutará (condición -> cuerpo
). Dichas condiciones pueden ser:
- Expresiones
- Comprobaciones de rangos
- Comprobaciones de tipos
Al haber coincidencia, se ejecuta el código en el cuerpo de la entrada (caso/rama) correspondiente.
Ejemplo: Tomar la entrada del usuario y determinar si es el carácter y
para continuar, n
para cerrar. De lo contrario asimilar como entrada inválida.
fun main() {
val input = 'y'
when (input) {
'y' -> print("Continuando...")
'n' -> print("Cerrando...")
else -> print("Entrada inválida")
}
}
El resultado de la evaluación anterior es:
Continuando...
Al igual que la expresión if, se usa else
en caso de que ninguna de las entradas sea satisfecha.
when
se podría considerar análoga a la sentencia switch
de Java. Solo que when
no requiere sentencias break
para determinar la terminación de las ramas de condición.
Múltiples Valores En Una Entrada
Si quieres comprobar múltiples valores en una entrada, pasa la lista separada por comas a la condición para el when
.
Ejemplo: Determinar que turno le toca al operario según la balota que obtuvo en el sorteo.
fun main() {
val input = 2
when (input) {
1, 2, 3 -> print("Te toca turno nocturno")
4, 5, 6 -> print("Te toca turno diurno")
}
}
El resultado en consola es:
Te toca turno nocturno
Usar Expresiones Como Condición
Como viste al inicio, las entradas reciben expresiones que puedan ser emparejadas con el sujeto.
Además de literales, también es posible usar expresiones variadas como conjunciones, comparaciones, operaciones, instanciaciones, etc.
Ejemplo: Determinar si la entrada coincide con los límites del tipo Char
.
fun main() {
val input = 100
when (input) {
Char.MAX_VALUE.toInt() -> print("Límite superior")
Char.MIN_VALUE.toInt() -> print("Límite inferior")
else -> print("No es ninguno de los límites")
}
}
Como salida tendrás:
No es ninguno de los límites
Rangos En When
Puedes usar rangos como condiciones de las entradas del when
. Denota la coincidencia con el operador in
o !in
.
Ejemplo: Determinar si número que el usuario introduce por teclado pertenece a los rangos [0,49] o [50,99].
fun main() {
print("Ingresa el número:")
val input = readLine()!!.toInt()
when (input) {
in 1..49 -> print("$input pertenece a [1..49]")
in 50..99 -> print("$input pertence a [50..99]")
else -> print("Fuera de los rangos contemplados")
}
}
Si ingresas el número 40, tendrás:
40 pertenece a [1..49]
Comparar Tipos Con when
when comprueba si una variable es de un tipo para determinar las acciones a seguir. La comparación es realizada con el operador is
.
Ejemplo: Comprobar si la respuesta de un formulario hipotético se tomó como entera o cadena.
fun main() {
val formResponse: Any = 12
when (formResponse) {
is Int -> print("Respuesta Entera")
is String -> print("Respuesta String")
}
}
A diferencia de Java, no es necesario castear la variable para determinar si es el tipo correcto. A esto se le llama Smart Cast en Kotlin.
Por ejemplo: Usar el código anterior y multiplicar los resultados por 100, sin importar el tipo.
fun main() {
val formResponse: Any = "12"
when (formResponse) {
is Int -> {
val times = formResponse * 100
print("Respuesta Entera:$times")
}
is String -> {
val times = formResponse.toInt() * 100
print("Respuesta String:$times")
}
}
}
Al ejecutar tendrás:
Respuesta String:1200
Nota que IntelliJ IDEA sobresalta el valor interpretado por el Smart Cast.
Usar When Como If
Por otro lado, si deseas comprobar expresiones booleanas sin tener un valor de comparación, entonces el when
puede escribirse sin argumento.
fun main() {
val a = -5
when {
a > 0 -> print("Es positivo")
a == 0 -> print("Es cero")
else -> print("Es negativo")
}
}
Declaración De Variable En El Sujeto
Si deseas pasar una variable en el argumento del when
, debes crear una expresión de asignación a una variable de solo lectura.
Ejemplo: Calcular el daño recibido por el jugador dependiendo de la suma de su suerte y bonos adicionales.
fun main() {
val playerLucky = 0.2
val bonus = 0.3
when (val damage: Double = playerLucky + bonus) {
in 0.0..0.3 -> print("Daño recibido:${damage * 10}")
in 0.3..0.6 -> print("Daño recibido:${damage * 20}")
in 0.6..1.0 -> print("Daño recibido:${damage * 30}")
}
}
Como ves, la variable damage
es declarada e inicializada en el sujeto del when, lo que permite usarla en su bloque de estructura.
El programa imprime el siguiente valor:
Daño recibido:10.0
When Como Expresión
when
puede ser usado como expresión en retornos y asignaciones de variables como la expresión if
.
Es obligatorio usar la rama else
, a menos que se garantice que las ramas definidas cubren todas las posibles opciones (Exhaustive when expression).
Por ejemplo: Imprimir el texto equivalente al número de una calificación que va del 1 al 5.
fun main() {
val markNumber = 4
val markText = when (markNumber) {
1 -> "Insuficiente"
2 -> "Deficiente"
3 -> "Aceptable"
4 -> "Sobresaliente"
5 -> "Excelente"
else -> "No permitido"
}
print("La calificación es: $markText")
}
Al número 4 le correspondería el resultado de:
La calificación es: Sobresaliente
¿Qué Sigue?
Al haber estudiado la expresión when en Kotlin, ya puedes adentrarte a los bucles (loops) para realizar iteraciones de sentencias, como por ejemplo el bucle for.
Únete Al Discord De Develou
Si tienes problemas con el código de este tutorial, preguntas, recomendaciones o solo deseas discutir sobre desarrollo Android conmigo y otros desarrolladores, únete a la comunidad de Discord de Develou y siéntete libre de participar como gustes. ¡Te espero!