Contenido del curso

Sentencia when de Kotlin vs if/else

Resumen

Cuando un programa empieza a llenarse de condiciones, los if/else anidados se vuelven difíciles de leer. La sentencia when en Kotlin resuelve ese problema: organiza múltiples condiciones de forma clara, permite asignar valores a variables y reemplaza al clásico switch case de otros lenguajes.

¿Qué es la sentencia when en Kotlin? Es una estructura de control que evalúa condiciones o argumentos y ejecuta la acción asociada a la primera coincidencia. Es la alternativa más legible al if/else cuando hay tres o más condiciones.

¿Cómo se escribe un when básico en Kotlin?

La idea es presentar cada condición a la izquierda y la acción a la derecha, conectadas por una flecha ->. El compilador evalúa una por una hasta encontrar la que se cumple.

Retomando el ejemplo del email visto en la clase anterior, puedes clasificar el correo según contenga admin, support o cualquier otro valor:

kotlin val email = "administrador@empresa.com"

when { email.contains("admin") -> println("administrador") email.contains("support") -> println("soporte") else -> println("usuario normal") }

Si necesitas ejecutar varias acciones para una misma condición, agrúpalas entre llaves {}, igual que harías dentro de una función. El else actúa como caso por defecto y, a diferencia del if, no requiere llaves para una sola línea.

¿Cuándo conviene usar when en lugar de if/else?

La recomendación práctica es usar when cuando tengas tres o más condiciones o cuando cada condición dispare una secuencia de comandos distinta. Para dos casos simples, un if/else sigue siendo suficiente.

  • Más de tres condiciones encadenadas.
  • Cada rama ejecuta acciones diferenciadas.
  • Quieres evitar if/else anidados poco legibles.

¿Cómo asignar el resultado de un when a una variable?

Al igual que el if/else, la sentencia when también funciona como expresión que devuelve un valor. La última línea de cada rama es la que se retorna y se asigna a la variable.

kotlin val tipoDeUsuario = when { email.contains("admin") -> "administrador" email.contains("support") -> "soporte" else -> "usuario normal" }

println("El tipo de usuario de $email es $tipoDeUsuario")

Kotlin infiere el tipo de la variable a partir de lo que devuelven las ramas. Si todas devuelven String, tipoDeUsuario será String. Si mezclas tipos distintos, Kotlin recurre a interfaces comunes como Comparable o Serializable, algo que por ahora conviene evitar para mantener el código simple.

¿El when puede reemplazar al switch case? Sí. Es el equivalente más cercano en Kotlin al switch case de otros lenguajes, pero más flexible: acepta condiciones booleanas, no solo igualdades.

¿Cómo usar when con un argumento y agrupar condiciones?

La segunda forma de usar when es pasarle un argumento entre paréntesis. La estructura compara ese valor contra cada caso, lo que resulta ideal para validar opciones cerradas como un proveedor de correo.

kotlin val proveedor = readLine()

when (proveedor) { "Gmail" -> println("Google Mail") "Yahoo" -> println("Yahoo Mail") "Outlook" -> println("Microsoft Outlook") else -> println("Otro proveedor") }

Usar readLine() en lugar de un valor fijo evita los warnings del IDE que avisan cuando una rama nunca se alcanzará por tener el valor hardcodeado.

¿Cómo combinar varias condiciones en una sola rama?

Dentro de un when sin argumento puedes encadenar condiciones con operadores lógicos para escenarios más ricos. Por ejemplo, validar si un email tiene formato correcto y además pertenece a Gmail:

kotlin val esEmailValido = email.contains("@") && email.contains(".com") val esGmail = email.contains("gmail")

when { esEmailValido && esGmail -> println("Es un correo válido del proveedor Gmail") esEmailValido -> println("Es un correo válido") else -> println("Es un correo no válido") }

El orden importa: la primera rama que se cumpla es la que se ejecuta, así que las condiciones más específicas siempre van arriba.

¿Cómo evaluar la fortaleza de una contraseña con when?

Un ejercicio típico consiste en crear una función evaluarPassword que clasifique una contraseña según su longitud. Las reglas son simples: ocho o más caracteres es fuerte, seis o más es media, y cualquier otro caso es débil.

kotlin fun evaluarPassword(password: String): String { return when { password.length >= 8 -> "fuerte" password.length >= 6 -> "media" else -> "débil" } }

fun main() { val password = readLine() ?: "" println("Es una contraseña ${evaluarPassword(password)}") }

Probando con distintos valores se obtienen tres resultados claros:

  • 12345678 devuelve fuerte.
  • 123456 devuelve media.
  • 12 devuelve débil.

En un caso real, una contraseña debería validar mucho más que la longitud, pero el ejemplo sirve para ver cómo when retorna directamente el String que la función entrega al println.

Habilidades y conceptos clave de la clase

  • Sentencia when [00:18]: estructura de control que organiza múltiples condiciones de forma legible.
  • Flecha -> [01:20]: separa la condición de la acción dentro de cada rama.
  • Bloques con llaves {} [01:40]: permiten ejecutar varias acciones bajo una misma condición.
  • Cláusula else [02:10]: define el comportamiento por defecto cuando ninguna rama se cumple.
  • When como expresión [03:30]: devuelve la última sentencia de la rama y permite asignarla a una variable.
  • Inferencia de tipos [04:00]: Kotlin deduce el tipo de la variable según lo retornado.
  • When con argumento [05:10]: compara un valor contra cada caso, similar a switch case.
  • readLine() [06:00]: lectura de entrada por consola para capturar datos del usuario.
  • Operadores lógicos && [07:00]: agrupan varias condiciones dentro de una misma rama.
  • Función evaluarPassword [08:20]: aplica when para clasificar contraseñas por longitud.

¿Ya probaste reescribir uno de tus if/else anidados como un when? Cuéntame en los comentarios qué caso resolviste y cómo cambió la legibilidad de tu código.