La Expresión When En Kotlin

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.

Smart cast to kotlin.String

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!