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í
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.
0 comentarios