Operador ternario en Kotlin: por qué no existe y cómo no pisar el rastrillo
\n\nSi vienes a Kotlin desde Java, C# o JavaScript, seguramente al menos una vez te has sorprendido pensando: «¿Dónde está mi querido operador ternario condición ? valor1 : valor2?». Spoiler: en Kotlin no existe. Y esto no es un error, sino una característica. Los desarrolladores del lenguaje decidieron que el ternario clásico es una entidad innecesaria que solo complica la lectura del código, especialmente cuando hay más de dos condiciones anidadas.
Pero la ausencia del operador ternario no es un problema. Kotlin ofrece alternativas mucho más flexibles y seguras. Sin embargo, los principiantes (e incluso desarrolladores experimentados) suelen cometer los mismos errores al intentar emular la construcción habitual. En este artículo, analizaremos los 5 errores principales al trabajar con expresiones condicionales en Kotlin y mostraremos cómo evitarlos. ¡Allá vamos!
\n\nError n.º 1: Intentar insertar el operador ternario «a lo bruto»
\n\nEl error más común es escribir código al estilo Java:
\n\n// ❌ Error: esta sintaxis no existe en Kotlin\nval max = (a > b) ? a : b\n\n\nKotlin simplemente no compilará este código. Obtendrá un error: Unresolved reference: ?. Muchos desarrolladores se quedan perplejos y comienzan a buscar bibliotecas o complementos que «agreguen» el operador ternario. ¡No haga esto!
¿Cómo hacerlo correctamente?
\n\nEn Kotlin, if no es un operador, sino una expresión. Devuelve un valor. Por lo tanto, en lugar del ternario, use un if-else normal:
// ✅ Forma correcta: if como expresión\nval max = if (a > b) a else b\n\n\nEl código se lee incluso más fácil que el ternario clásico, especialmente si la condición es compleja. Recuerde: if en Kotlin siempre devuelve el último valor en cada rama.
Error n.º 2: Olvidar el else al asignar
\n\nDado que if es una expresión, debe devolver un valor. Si escribe:
// ❌ Error: no hay else, el compilador no sabe qué devolver\nval result = if (condition) "Yes"\n\n\nEl compilador mostrará un error: All branches of 'if' expression are required to return a value. Es lógico: ¿qué debería tener result si la condición es falsa? ¿null? ¿Una cadena vacía? El compilador no adivina.
¿Cómo hacerlo correctamente?
\n\nSiempre agregue else:
// ✅ Correcto: ambas ramas devuelven un valor\nval result = if (condition) "Yes" else "No"\n\n\nExcepción: si usa if como operador (sin asignación). Entonces else no es obligatorio:
// if como operador — else no es necesario\nif (condition) {\n println("Yes")\n}\n\n\nError n.º 3: if-else anidados complejos en lugar de when
\n\nCuando tiene más de dos opciones, una cadena de if-else if-else se convierte en «espagueti». Mire este horror:
// ❌ Mal: if-else anidados difíciles de leer\nval status = if (code == 200) "OK"\n else if (code == 404) "Not Found"\n else if (code == 500) "Server Error"\n else "Unknown"\n\n\nLas líneas saltan, los ojos se pierden. Y si agrega un par de condiciones más, será una pesadilla.
\n\n¿Cómo hacerlo correctamente?
\n\nUse when — es un análogo de switch con esteroides:
// ✅ Excelente: when se lee como una tabla\nval status = when (code) {\n 200 -> "OK"\n 404 -> "Not Found"\n 500 -> "Server Error"\n else -> "Unknown"\n}\n\n\nwhen en Kotlin también es una expresión, por lo que puede devolver un valor. Y es mucho más claro que una cadena de if-else. Además, when admite condiciones complejas: rangos, tipos, expresiones arbitrarias.
// when con rango\nval grade = when (score) {\n i