Operador Ternário em Kotlin: por que ele não existe e como não pisar na bola
\n\nSe você veio para o Kotlin vindo do Java, C# ou JavaScript, com certeza já se pegou pensando: "Onde está meu amado operador ternário condição ? valor1 : valor2?". Spoiler: ele não existe em Kotlin. E isso não é um bug, é uma feature. Os desenvolvedores da linguagem decidiram que o ternário clássico é uma entidade desnecessária que só dificulta a leitura do código, especialmente quando há mais de duas condições aninhadas.
Mas a ausência do operador ternário não é um problema. Kotlin oferece alternativas muito mais flexíveis e seguras. No entanto, iniciantes (e até desenvolvedores experientes) frequentemente cometem os mesmos erros ao tentar emular a construção habitual. Neste artigo, vamos analisar os 5 principais erros ao trabalhar com expressões condicionais em Kotlin e mostrar como evitá-los. Vamos nessa!
\n\nErro nº 1: Tentar usar o operador ternário "na cara dura"
\n\nO erro mais comum é escrever código no estilo Java:
\n\n// ❌ Erro: essa sintaxe não existe em Kotlin\nval max = (a > b) ? a : b\n\n\nKotlin simplesmente não compilará esse código. Você receberá o erro: Unresolved reference: ?. Muitos desenvolvedores ficam perdidos e começam a procurar bibliotecas ou plugins que "adicionam" o operador ternário. Não faça isso!
Como fazer corretamente?
\n\nEm Kotlin, if não é um operador, mas sim uma expressão. Ele retorna um valor. Portanto, em vez do ternário, use o if-else comum:
// ✅ Maneira correta: if como expressão\nval max = if (a > b) a else b\n\n\nO código fica até mais fácil de ler do que o ternário clássico, especialmente se a condição for complexa. Lembre-se: if em Kotlin sempre retorna o último valor em cada ramificação.
Erro nº 2: Esquecer o else ao fazer uma atribuição
\n\nComo if é uma expressão, ele deve retornar um valor. Se você escrever:
// ❌ Erro: sem else, o compilador não sabe o que retornar\nval result = if (condition) "Yes"\n\n\nO compilador emitirá um erro: All branches of 'if' expression are required to return a value. Isso é lógico: o que deveria estar em result se a condição for falsa? null? Uma string vazia? O compilador não adivinha.
Como fazer corretamente?
\n\nSempre adicione o else:
// ✅ Correto: ambas as ramificações retornam um valor\nval result = if (condition) "Yes" else "No"\n\n\nExceção: se você estiver usando if como uma instrução (sem atribuição), o else não é obrigatório:
// Instrução if — else não é necessário\nif (condition) {\n println("Yes")\n}\n\n\nErro nº 3: if-else aninhados complexos em vez de when
\n\nQuando você tem mais de duas opções, uma cadeia de if-else if-else vira um "espaguete". Veja este horror:
// ❌ Ruim: if-else aninhados são difíceis de ler\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\nAs linhas pulam, os olhos se perdem. E se você adicionar mais algumas condições, vira um pesadelo.
\n\nComo fazer corretamente?
\n\nUse when — é um análogo do switch turbinado:
// ✅ Ótimo: when se lê como uma tabela\nval status = when (code) {\n 200 -> "OK"\n 404 -> "Not Found"\n 500 -> "Server Error"\n else -> "Unknown"\n}\n\n\nwhen em Kotlin também é uma expressão, portanto pode retornar um valor. E é muito mais claro do que uma cadeia de if-else. Além disso, when suporta condições complexas: intervalos, tipos, expressões arbitrárias.
// when com intervalo\nval grade = when (score) {\n i