Siguiendo con el control de flujo, la siguiente expresión que debemos ver es when. Esta nos permite realizar una o varias acciones dependiendo del resultado recibido. También se podría hacer con el tutorial anterior (if-else en Kotlin)  anidando if-else, pero no sería lo correcto. La forma óptima es esta. Para los que tengan conocimientos básicos de programación en otro lenguaje, when es el sustituto del switch.

When

fun main(args: Array<String>) {
    getMonth(2)
}
fun getMonth(month : Int){
    when (month) {
        1 -> print("Enero")
        2 -> print("Febrero")
        3 -> print("Marzo")
        4 -> print("Abril")
        5 -> print("Mayo")
        6 -> print("Junio")
        7 -> print("Julio")
        8 -> print("Agosto")
        9 -> print("Septiembre")
        10 -> print("Octubre")
        11 -> print("Noviembre")
        12 -> print("Diciembre")
        else -> {
            print("No corresponde a ningún mes del año")
        }
    }
}

El ejemplo es muy sencillo. La función getMonth recibe un Int que se lo mandamos a el when, una vez ahí comprobará todos los casos disponibles (aquí tenemos de 1 a 12). Si concuerda con algún valor, automáticamente entrará por ahí y realizará  la función oportuna, en este caso pintar el mes.

Si por el contrario no encuentra ningún caso igual, entrará por el else. Dicho else no es obligatorio así que se puede quitar, y si no entra por ningún caso pues simplemente no mostrará nada.

La expresión when no solo soporta números, sino que puede trabajar con textos y expresiones.

En este ejemplo podemos ver como separar varios valores a través de comas.

fun getMonth(month : Int){
    when (month) {
        1,2,3 -> print("Primer trimestre del año")
        4,5,6 -> print("segundo trimestre del año")
        7,8,9 -> print("tercer trimestre del año")
        10,11,12 -> print("cuarto trimestre del año")
    }
}

Si son rangos más altos tenemos la posibilidad de usar in y !in para trabajar con arrays y ranges (lo veremos más tarde).

fun getMonth(month : Int){
    when (month) {
        in 1..6 -> print("Primer semestre")
        in 7..12 -> print("segundo semestre")
    }
}

Con esto podemos comprobar si está entre una cantidad de números específicos (en este caso entre 1 y 6 y 7 y 12) o si por el contrario no está en un rango específico (de 1 a 12) poniendo una exclamación al principio de la expresión in.

fun getMonth(month : Int){
    when (month) {
        in 1..6 -> print("Primer semestre")
        in 7..12 -> print("segundo semestre")
        !in 1..12 -> print("no es un mes válido")
    }
}

También podemos usar la expresión is para comprobar el tipo de variable que es.

fun result(value: Any){
    when (value){
        is Int -> print(value + 1)
        is String -> print("El texto es $value")
        is Boolean -> if (value) print("es verdadero") else print("es falso")
    }
}

Si es Int, sumará 1 al valor, si es una String lo concatenará al texto que vemos arriba y si es un Booleano nos pintará un resultado dependiendo si es true o falso.

Para finalizar mostraros también que podemos guardar el resultado de un when automáticamente.

fun result(month : Int){
    val response : String = when (month) {
        in 1..6 -> "Primer semestre"
        in 7..12 -> "segundo semestre"
        !in 1..12 -> "no es un mes válido"
        else ->  "error"
    }
}

Hemos declarado la variable de tipo String, pero podríamos hacerla de tipo Any si no tuviéramos claro el resultado de la expresión. Aquí si es obligatorio añadir un else, aunque como podéis apreciar, podemos quitar los paréntesis de dicha condición.

Continúa con el curso: Capítulo 9 – Arrays en Kotlin