Utilizando la expresión when en Kotlin, el switch supervitaminado (KDA 13)
Antonio Leiva

Los switch en Java, y especialmente en Java 6, tienen una potencia muy limitada. Fuera de ciertos tipos muy cerrados, no se puede utilizar para nada más.

Pero sin embargo when puede hacer todo lo que se te ocurra hacer con un switch y mucho más.

En realidad, con la expresión when de Kotlin puedes sustituir los if/else más complejos que puedas tener en tu código.

¿Te gustaría comenzar hoy a dar el siguiente paso? Te recomiendo que entres en mi training gratuito aquí

Training Revienta tu productividad en Android con Kotlin

La expresión when

Para empezar, la puedes usar como cualquier switch básico. Imagina que por ejemplo tienes una vista y quieres mostrar un toast en función de su visibilidad.

Puedes hacer:

when(view.visibility){
    View.VISIBLE -> toast("visible")
    View.INVISIBLE -> toast("invisible")
    else -> toast("gone")
}

En la expresión when, else es lo mismo que el default del switch.

Pero when tiene algunas funcionalidad extra muy potentes:

Casting automático

Si en el lado izquierdo compruebas que la clase es de un tipo, en el lado derecho ya la tendrás casteada sin necesidad de hacer nada extra:

when (view) {
    is TextView -> toast(view.text)
    is RecyclerView -> toast("Item count = ${view.adapter.itemCount}")
    is SearchView -> toast("Current query: ${view.query}")
    else -> toast("View type not supported")
}

Además de comprobar el tipo, when puede mirar por ejemplo is un elemento está dentro de un rango o de una lista, con la palabra reservada in.

when sin argumentos

Con esta opción, podemos hacer prácticamente la comprobación que queramos.

val res = when {
    x in 1..10 -> "cheap"
    s.contains("hello") -> "it's a welcome!"
    v is ViewGroup -> "child count: ${v.getChildCount()}"
    else -> ""
}

Como when es una expresión, puede retornar un valor que se puede almacenar en una variable.

Un ejemplo aplicado a Android

Los anteriores ejemplos son muy simplones y lejos de tener utilidad real.

Pero un ejemplo que me gusta mucho es el de consumir la respuesta en un onOptionsItemSelected().

override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) {
    R.id.home -> consume { navigateToHome() }
    R.id.search -> consume { MenuItemCompat.expandActionView(item) }
    R.id.settings -> consume { navigateToSettings() }
    else -> super.onOptionsItemSelected(item)
}

La función consume es una función muy tonta que ejecuta la operación y devuelve true. La encuentro muy útil para los métodos del framework de Android que necesitan indicar si han consumido el resultado.

El código es muy simple:

inline fun consume(f: () -> Unit): Boolean {
    f()
    return true
}

Conclusión

Con la expresión when puedes hacer muy sencillo el código donde necesitas especificar el comportamiento en función de diferentes caminos, y donde los switch originales de Java se quedarían muy cortos.

Si te gusta lo que has visto, te animo a que te apuntes a mi training gratuito, donde te contaré todo lo que necesitas para aprender a crear tus Apps Android en Kotlin desde cero.

Quizá también te interese…

Kotlin 1.5.0 : Las 5 novedades que puedes empezar a usar hoy

Kotlin 1.5.0 : Las 5 novedades que puedes empezar a usar hoy

Kotlin 1.5.0 ya está aquí, y como siempre trae una serie de novedades que te van a interesar muchísimo. Cabe destacar que a partir de ahora, de acuerdo las nuevas versiones de Kotlin se lanzarán cada 6 meses, independientemente de las nuevas funcionalidades que...

¿Qué es Kotlin y para qué sirve?

¿Qué es Kotlin y para qué sirve?

Kotlin es un lenguaje de programación de código abierto creado por JetBrains que se ha popularizado gracias a que se puede utilizar para programar aplicaciones Android. Pero si has llegado hasta aquí pensando que Kotlin solo se puede usar en Android, lo que te voy a...

2 formas de recolectar Flows en la UI que SÍ funcionan

2 formas de recolectar Flows en la UI que SÍ funcionan

En la serie de artículos sobre Programación Reactiva con Flow hemos visto muchos conceptos, y hemos aprendido cómo aplicarlos al desarrollo Android. Pero hay algo que no hemos hecho del todo bien. Esto es la recolección de Flows desde la Activity (o el Fragment, en...

0 comentarios

Enviar un comentario

Los datos personales que proporciones a través de este formulario quedarán registrados en un fichero de Antonio Leiva Gordillo, con el fin de gestionar los comentarios que realizas en este blog. La legitimación se realiza a través del consentimiento de la parte interesada. Si no se acepta, no podrás comentar en este blog. Los datos que proporciona solo se utilizan para evitar el correo no deseado y no se usarán para nada más. Puede ejercer los derechos de acceso, rectificación, cancelación y oposición en contacto@devexperto.com.

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Acepto la política de privacidad *