1. Antes de começar
Condicionais são uma das bases mais importantes da programação. Eles são comandos em linguagens de programação que processam decisões. Com os condicionais, o código é dinâmico, o que significa que ele pode se comportar de maneira diferente dependendo da condição.
Este codelab ensina a usar instruções e expressões if/else e when para criar condicionais em Kotlin.
Pré-requisitos
- Conhecimentos básicos de programação em Kotlin, incluindo variáveis e as funções
println()emain().
O que você vai aprender
- Como escrever expressões booleanas.
- Como escrever instruções
if/else. - Como escrever instruções
when. - Como escrever expressões
if/else. - Como escrever expressões
when. - Como usar vírgulas para definir o comportamento comum de várias ramificações em condicionais
when. - Como usar o intervalo
inpara definir um comportamento comum para um intervalo de ramificações em condicionaiswhen. - Como usar a palavra-chave
ispara escrever instruções condicionaiswhen.
O que é necessário
- Um navegador da Web com acesso ao Playground Kotlin.
2. Usar instruções if/else para expressar condições
Na vida real, é comum fazer as coisas de maneira diferente com base na situação que você enfrenta. Por exemplo, quando está frio, você usa uma jaqueta. Quando está quente, você não usa.

A tomada de decisões também é um conceito fundamental na programação. Você escreve instruções sobre como um programa deve se comportar em determinada situação para agir ou reagir conforme necessário quando a situação ocorrer. Em Kotlin, quando quiser que o programa execute diferentes ações com base em uma condição, você pode usar uma instrução if/else. Na próxima seção, você vai escrever uma instrução if.
Escrever condições if com expressões booleanas
Imagine que você quer criar um programa que informe aos motoristas o que eles devem fazer quando estiverem em um semáforo. Foque na primeira condição: um semáforo vermelho. O que você faz em um semáforo vermelho? Para o veículo.

Em Kotlin, você pode expressar essa condição com uma instrução if. Veja a anatomia de uma instrução if:

Nas instruções if, use a palavra-chave if seguida pela condição que você quer avaliar. Você precisa expressar a condição com uma expressão booleana. As expressões combinam valores, variáveis e operadores que retornam um valor. As expressões booleanas retornam um valor booleano.
Anteriormente, você aprendeu sobre os operadores de atribuição. Por exemplo:
val number = 1
O operador de atribuição = atribui um valor 1 à variável number.
Por outro lado, as expressões booleanas são construídas com operadores de comparação, que comparam valores ou variáveis nos dois lados da equação. Veja um operador de comparação.
1 == 1
O operador de comparação == compara os valores entre si. Qual valor booleano você acha que essa expressão retorna?
Encontre o valor booleano desta expressão:
- Use o Playground Kotlin para executar seu código.
- No corpo da função, adicione uma função
println()e, em seguida, transmita a expressão1 == 1como um argumento:
fun main() {
println(1 == 1)
}
- Execute o programa e veja o resultado:
true
O primeiro valor de 1 é igual ao segundo valor de 1. Portanto, a expressão booleana retorna um valor booleano true.
Testar
Além do operador ==, há outros operadores de comparação que podem ser usados para criar expressões booleanas:
- Menor que:
< - Maior que:
> - Menor ou igual a:
<= - Maior ou igual a:
>= - Diferente de:
!=
Pratique o uso de operadores de comparação com expressões simples:
- No argumento, substitua o operador de comparação
==pelo operador<:
fun main() {
println(1 < 1)
}
- Execute o programa e veja o resultado:
O resultado retorna um valor false porque o primeiro valor de 1 não é menor que o segundo valor de 1.
false
- Repita as duas primeiras etapas com os outros operadores de comparação e números.
Escrever uma instrução if simples
Agora que você viu alguns exemplos de como escrever expressões booleanas, já pode escrever sua primeira instrução if. A sintaxe de uma instrução if é esta:

Uma instrução if começa com a palavra-chave if seguida por uma condição, que é uma expressão booleana entre parênteses e um conjunto de chaves. O corpo é uma série de instruções ou expressões que são colocadas dentro de um par de chaves depois da condição. Essas instruções ou expressões são executadas somente quando a condição é atendida. Em outras palavras, as instruções dentro das chaves só são executadas quando uma expressão booleana na ramificação if retorna um valor true.
Escreva uma instrução if para a condição de semáforo vermelho:
- Na função
main(), crie uma variáveltrafficLightColore atribua a ela um valor"Red":
fun main() {
val trafficLightColor = "Red"
}
- Adicione uma instrução
ifpara a condição de semáforo vermelho e transmita a ela uma expressãotrafficLightColor == "Red":
fun main() {
val trafficLightColor = "Red"
if (trafficLightColor == "Red") {
}
}
- No corpo da instrução
if, adicione uma funçãoprintln()e, em seguida, transmita um argumento"Stop":
fun main() {
val trafficLightColor = "Red"
if (trafficLightColor == "Red") {
println("Stop")
}
}
- Execute o programa e veja o resultado:
Stop
A expressão trafficLightColor == "Red" retorna um valor true. Portanto, a instrução println("Stop") é executada, mostrando a mensagem Stop.

Adicionar uma ramificação else
Agora você pode ampliar o programa para que ele informe aos motoristas que eles devem seguir quando o semáforo não estiver vermelho.

É necessário adicionar uma ramificação else para criar uma instrução if/else. Uma ramificação é uma parte incompleta do código que pode ser mesclada para formar instruções ou expressões. Uma ramificação else precisa vir depois de uma ramificação if.

Depois da chave de fechamento da instrução if, adicione a palavra-chave else seguida por um par de chaves. Dentro das chaves da instrução else, você pode adicionar um segundo corpo que só é executado quando a condição na ramificação if é falsa.
Adicione uma ramificação else ao programa:
- Depois da chave de fechamento da instrução
if, adicione a palavra-chaveelseseguida por outro par de chaves:
fun main() {
val trafficLightColor = "Red"
if (trafficLightColor == "Red") {
println("Stop")
} else {
}
}
- Dentro das chaves da palavra-chave
else, adicione uma funçãoprintln()e, em seguida, transmita um argumento"Go":
fun main() {
val trafficLightColor = "Red"
if (trafficLightColor == "Red") {
println("Stop")
} else {
println("Go")
}
}
- Execute o programa e veja o resultado:
Stop
O programa ainda se comporta da mesma forma que antes da ramificação else ser adicionada, mas não mostra uma mensagem Go.
- Reatribua a variável
trafficLightColora um valor"Green"porque você quer que os motoristas avancem no sinal verde:
fun main() {
val trafficLightColor = "Green"
if (trafficLightColor == "Red") {
println("Stop")
} else {
println("Go")
}
}
- Execute o programa e veja o resultado:
Go
Como você pode ver, agora o programa mostra uma mensagem Go (seguir) em vez de uma mensagem Stop (parar).

Você reatribuiu a variável trafficLightColor a um valor "Green". A expressão trafficLightColor == "Red" avaliada na ramificação if retorna um valor false porque o valor "Green" não é igual ao "Red".
Como resultado, o programa pula todas as instruções na ramificação if e, em vez disso, executa todas as instruções na ramificação else. Isso significa que a função println("Go") é executada, mas a função println("Stop") não.
Adicionar uma ramificação else if
Normalmente, um semáforo também tem uma cor amarela que diz para os motoristas continuarem lentamente. Você pode expandir o processo de tomada de decisão do programa para refletir isso.

Você aprendeu a escrever condicionais que atendem a um único ponto de decisão com instruções if/else que contêm um único if e uma única ramificação else. Como processar ramificações mais complexas com vários pontos de decisão? Ao enfrentar vários pontos de decisão, você precisa criar condicionais com várias camadas de condições, o que pode ser feito ao adicionar ramificações else if a instruções if/else.
Depois da chave de fechamento da ramificação if, é necessário adicionar a palavra-chave else if. Dentro dos parênteses da palavra-chave else if, você precisa adicionar uma expressão booleana como a condição para a ramificação else if seguida por um corpo dentro de um par de chaves. O corpo só vai ser executado se a condição 1 falhar, mas a condição 2 for satisfeita.

A ramificação else if fica sempre localizada depois da ramificação if, mas antes da ramificação else. É possível usar várias ramificações else if em uma instrução:

A instrução if também pode conter a ramificação if e as ramificações else if sem nenhuma ramificação else:

Adicione uma ramificação else if ao programa:
- Depois da chave de fechamento da instrução
if, adicione uma expressãoelse if (trafficLightColor == "Yellow")seguida por chaves:
fun main() {
val trafficLightColor = "Green"
if (trafficLightColor == "Red") {
println("Stop")
} else if (trafficLightColor == "Yellow") {
} else {
println("Go")
}
}
- Dentro das chaves da ramificação
else if, adicione uma instruçãoprintln()e, em seguida, transmita um argumento de string"Slow":
fun main() {
val trafficLightColor = "Green"
if (trafficLightColor == "Red") {
println("Stop")
} else if (trafficLightColor == "Yellow") {
println("Slow")
} else {
println("Go")
}
}
- Reatribua a variável
trafficLightColora um valor de string"Yellow":
fun main() {
val trafficLightColor = "Yellow"
if (trafficLightColor == "Red") {
println("Stop")
} else if (trafficLightColor == "Yellow") {
println("Slow")
} else {
println("Go")
}
}
- Execute o programa e veja o resultado:
Slow
Agora, o programa mostra uma mensagem Slow (diminuir a velocidade), em vez de uma mensagem Stop (parar) ou Go (seguir).
<img "yellow"="" 1="" 2="" 2.="" alt="A diagram that highlights the if/else statement with the trafficLightColor == " and="" are="" as="" be="" body="" boolean="" but="" clause="" condition="" executed="" expression="" false,="" false."="" if="" in="" is="" noted="" only="" println("go")="" println("slow")="" println("stop")="" red"="" sizes="(max-width: 840px) 100vw, 856px" src="/static/codelabs/basic-android-kotlin-compose-conditionals/img/8d5e322ddf1acd52.png" srcset="/static/codelabs/basic-android-kotlin-compose-conditionals/img/8d5e322ddf1acd52_36.png 36w,/static/codelabs/basic-android-kotlin-compose-conditionals/img/8d5e322ddf1acd52_48.png 48w,/static/codelabs/basic-android-kotlin-compose-conditionals/img/8d5e322ddf1acd52_72.png 72w,/static/codelabs/basic-android-kotlin-compose-conditionals/img/8d5e322ddf1acd52_96.png 96w,/static/codelabs/basic-android-kotlin-compose-conditionals/img/8d5e322ddf1acd52_480.png 480w,/static/codelabs/basic-android-kotlin-compose-conditionals/img/8d5e322ddf1acd52_720.png 720w,/static/codelabs/basic-android-kotlin-compose-conditionals/img/8d5e322ddf1acd52_856.png 856w,/static/codelabs/basic-android-kotlin-compose-conditionals/img/8d5e322ddf1acd52_960.png 960w,/static/codelabs/basic-android-kotlin-compose-conditionals/img/8d5e322ddf1acd52_1440.png 1440w,/static/codelabs/basic-android-kotlin-compose-conditionals/img/8d5e322ddf1acd52_1920.png 1920w,/static/codelabs/basic-android-kotlin-compose-conditionals/img/8d5e322ddf1acd52_2880.png 2880w" statements="" style="width: 624.00px" the="" to="" trafficlightcolor="=" true.="" when="" />
Veja porque apenas a mensagem Slow é mostrada, e não as outras linhas:
- Um valor
"Yellow"é atribuído à variáveltrafficLightColor. - O valor
"Yellow"não é igual ao valor"Red". A expressão booleana da ramificaçãoif(identificada como 1 na imagem) retorna um valorfalse. O programa pula todas as instruções dentro da ramificaçãoife não mostra uma mensagemStop. - Como a ramificação
ifproduz um valorfalse, o programa continua a avaliar a expressão booleana dentro da ramificaçãoelse if. - O valor
"Yellow"é igual ao valor"Yellow". A expressão booleana da ramificaçãoelse if(representada como 2 na imagem) retorna um valortrue. O programa executa todas as instruções dentro da ramificaçãoelse ife mostra uma mensagemSlow. - Como a expressão booleana da ramificação
else ifretorna um valortrue, o programa ignora o restante das ramificações. Assim, nenhuma das instruções na ramificaçãoelseé executada, e o programa não mostra uma mensagemGo.
Testar
Você percebeu que o programa atual contém um bug?
Na unidade 1, você aprendeu sobre um tipo de bug conhecido como erro de compilação, em que o Kotlin não pode compilar o código devido a um erro de sintaxe, e o programa não pode ser executado. Aqui, você enfrenta outro tipo de bug conhecido como erro de lógica, em que o programa pode ser executado, mas não produz um resultado conforme o esperado.
Supondo que você queira que os motoristas dirijam apenas quando a luz do semáforo estiver verde, o que vai acontecer se o semáforo estiver quebrado e desligado? Você quer que o motorista continue dirigindo ou receba um aviso de que algo está errado?
Infelizmente, no programa atual, se a cor do semáforo for diferente de vermelho ou amarelo, recomendamos que o motorista avance.
Corrija este problema:
- Reatribua a variável
trafficLightColora um valor"Black"para ilustrar um semáforo que está desligado:
fun main() {
val trafficLightColor = "Black"
if (trafficLightColor == "Red") {
println("Stop")
} else if (trafficLightColor == "Yellow") {
println("Slow")
} else {
println("Go")
}
}
- Execute o programa e veja o resultado:
Go
O programa mostra uma mensagem Go, mesmo que a variável trafficLightColor não receba um valor "Green". Você consegue corrigir o programa para que ele reflita o comportamento correto?

Você precisa modificar o programa para mostrar:
- Uma mensagem
Gosomente quando a variáveltrafficLightColoré atribuída a um valor"Green". - Uma mensagem
Invalid traffic-light colorquando a variáveltrafficLightColornão recebe um valor"Red","Yellow"ou"Green".
Corrigir a ramificação else
A ramificação else está sempre localizada no final de uma instrução if/else porque é uma ramificação "pega-tudo". Ela é executada automaticamente quando todas as outras condições nas ramificações anteriores não são satisfeitas. A ramificação else não é adequada quando você quer que uma ação seja executada somente quando uma condição específica for atendida. No caso do semáforo, use a ramificação else if para especificar a condição das luzes verdes.
Use a ramificação else if para avaliar a condição de semáforo verde:
- Depois da ramificação
else ifatual, adicione outra ramificaçãoelse if (trafficLightColor == "Green"):
fun main() {
val trafficLightColor = "Black"
if (trafficLightColor == "Red") {
println("Stop")
} else if (trafficLightColor == "Yellow") {
println("Slow")
} else if (trafficLightColor == "Green") {
println("Go")
}
}
- Execute o programa e veja o resultado.
A saída está vazia porque você não tem uma ramificação else que é executada quando as condições anteriores não são atendidas.
- Depois da última ramificação
else if, adicione uma ramificaçãoelsecom uma instruçãoprintln("Invalid traffic-light color"):
fun main() {
val trafficLightColor = "Black"
if (trafficLightColor == "Red") {
println("Stop")
} else if (trafficLightColor == "Yellow") {
println("Slow")
} else if (trafficLightColor == "Green") {
println("Go")
} else {
println("Invalid traffic-light color")
}
}
- Execute o programa e veja o resultado:
Invalid traffic-light color
- Atribua outro valor à variável
trafficLightColoralém de"Red","Yellow"ou"Green"e, em seguida, execute o programa novamente.
Qual é o resultado do programa?
É recomendável ter uma ramificação else if explícita como validação de entrada para a cor verde e uma ramificação else para capturar outras entradas inválidas. Isso garante que os motoristas sejam instruídos a seguir, somente quando o semáforo estiver verde. Em outros casos, uma mensagem explícita de que o semáforo não está se comportando conforme o esperado é mostrada.
3. Usar uma instrução when para várias ramificações
O programa trafficLightColor parece mais complexo com várias condições, também conhecidas como ramificações. Você pode se perguntar se é possível simplificar um programa com um número ainda maior de ramificações.
Em Kotlin, ao lidar com várias ramificações, você pode usar a instrução when em vez de if/else porque ela melhora a legibilidade, ou seja, as pessoas podem ler o código com mais facilidade. É muito importante considerar a legibilidade ao escrever um programa porque é provável que outros desenvolvedores precisem revisar e modificar o código durante todo o ciclo de vida. Uma boa legibilidade garante que os desenvolvedores entendam corretamente o código e não introduzam bugs nele de forma acidental.
É recomendável usar as instruções when quando há mais de duas ramificações a serem consideradas.

Uma instrução when aceita um único valor do parâmetro. O valor é avaliado de acordo com cada uma das condições sequencialmente. Em seguida, o corpo correspondente da primeira condição atendida é executado. Cada condição e corpo são separados por uma seta (->). Assim como as instruções if/else, cada par de condição e corpo é chamado de ramificação em instruções when. Também semelhante à instrução if/else, é possível adicionar uma ramificação else como condição final em uma instrução when que funciona como uma ramificação "pega-tudo".
Reescrever uma instrução if/else com uma instrução when
No programa do semáforo, já existem várias ramificações:
- Semáforo vermelho
- Semáforo amarelo
- Semáforo verde
- Outra cor do semáforo
Converta o programa para usar uma instrução when:
- Na função
main(), remova a instruçãoif/else:
fun main() {
val trafficLightColor = "Black"
}
- Adicione uma instrução
whene transmita a variáveltrafficLightColorcomo um argumento:
fun main() {
val trafficLightColor = "Black"
when (trafficLightColor) {
}
}
- No corpo da instrução
when, adicione a condição"Red"seguida por uma seta e um corpoprintln("Stop"):
fun main() {
val trafficLightColor = "Black"
when (trafficLightColor) {
"Red" -> println("Stop")
}
}
- Na próxima linha, adicione a condição
"Yellow"seguida por uma seta e um corpoprintln("Slow"):
fun main() {
val trafficLightColor = "Black"
when (trafficLightColor) {
"Red" -> println("Stop")
"Yellow" -> println("Slow")
}
}
- Na próxima linha, adicione a condição
"Green"seguida por uma seta e um corpoprintln("Go"):
fun main() {
val trafficLightColor = "Black"
when (trafficLightColor) {
"Red" -> println("Stop")
"Yellow" -> println("Slow")
"Green" -> println("Go")
}
}
- Na próxima linha, adicione a palavra-chave
elseseguida por uma seta e um corpoprintln("Invalid traffic-light color"):
fun main() {
val trafficLightColor = "Black"
when (trafficLightColor) {
"Red" -> println("Stop")
"Yellow" -> println("Slow")
"Green" -> println("Go")
else -> println("Invalid traffic-light color")
}
}
- Reatribua a variável
trafficLightColora um valor"Yellow":
fun main() {
val trafficLightColor = "Yellow"
when (trafficLightColor) {
"Red" -> println("Stop")
"Yellow" -> println("Slow")
"Green" -> println("Go")
else -> println("Invalid traffic-light color")
}
}
Qual vai ser o resultado do programa?
- Execute o programa e veja o resultado:
Slow

A saída é uma mensagem Slow porque:
- Um valor
"Yellow"é atribuído à variáveltrafficLightColor. - O programa avalia cada condição individualmente em sequência.
- O valor
"Yellow"não é igual ao valor"Red", então o programa pula o primeiro corpo. - O valor
"Yellow"é igual ao valor"Yellow", então o programa executa o segundo corpo e mostra uma mensagemSlow. - Um corpo foi executado, então o programa ignora a terceira e a quarta ramificações e sai da instrução
when.
Escrever condições mais complexas em uma instrução when
Até agora, você aprendeu a escrever condições when para uma única condição de igualdade, como quando a variável trafficLightColor recebe um valor "Yellow". Em seguida, você vai aprender a usar a vírgula (,) e as palavras-chave in e is para formar condições when mais complexas.
Crie um programa que determine se um número entre 1 e 10 é um número primo:
- Abra o Playground Kotlin em outra janela.
Vamos voltar ao programa de semáforo mais tarde.
- Defina uma variável
xe atribua a ela um valor3:
fun main() {
val x = 3
}
- Adicione uma instrução
whenque inclua várias ramificações para as condições2,3,5e7e coloque um corpoprintln("x is prime number between 1 and 10.")depois de cada uma:
fun main() {
val x = 3
when (x) {
2 -> println("x is a prime number between 1 and 10.")
3 -> println("x is a prime number between 1 and 10.")
5 -> println("x is a prime number between 1 and 10.")
7 -> println("x is a prime number between 1 and 10.")
}
}
- Adicione uma ramificação
elsecom um corpoprintln("x is not prime number between 1 and 10."):
fun main() {
val x = 3
when (x) {
2 -> println("x is a prime number between 1 and 10.")
3 -> println("x is a prime number between 1 and 10.")
5 -> println("x is a prime number between 1 and 10.")
7 -> println("x is a prime number between 1 and 10.")
else -> println("x isn't a prime number between 1 and 10.")
}
}
- Execute o programa e verifique se o resultado está conforme o esperado:
x is a prime number between 1 and 10.
Usar uma vírgula (,) para várias condições
O programa de números primos contém muitas repetições de instruções println(). Ao escrever uma instrução when, use uma vírgula (,) para indicar várias condições que correspondem ao mesmo corpo.

No diagrama anterior, se a primeira ou a segunda condição for atendida, o corpo correspondente vai ser executado.
Reescreva o programa de números primos com este conceito:
- Na ramificação da condição
2, adicione os números3,5e7, separados por vírgulas (,):
fun main() {
val x = 3
when (x) {
2, 3, 5, 7 -> println("x is a prime number between 1 and 10.")
3 -> println("x is a prime number between 1 and 10.")
5 -> println("x is a prime number between 1 and 10.")
7 -> println("x is a prime number between 1 and 10.")
else -> println("x isn't a prime number between 1 and 10.")
}
}
- Remova as ramificações individuais das condições
3,5e7:
fun main() {
val x = 3
when (x) {
2, 3, 5, 7 -> println("x is a prime number between 1 and 10.")
else -> println("x isn't a prime number between 1 and 10.")
}
}
- Execute o programa e verifique se o resultado está conforme o esperado:
x is a prime number between 1 and 10.
Usar a palavra-chave in para várias condições
Além do símbolo de vírgula (,) para indicar várias condições, também é possível usar a palavra-chave in e um intervalo de valores em ramificações when.

Para usar um intervalo de valores, adicione um número que indique o início do intervalo seguido por dois pontos sem espaços e feche-o com outro número que indique o final do intervalo.
Quando o valor do parâmetro é igual a qualquer valor no intervalo entre o início e o fim, o primeiro corpo é executado.
No programa de números primos, é possível mostrar uma mensagem se o número estiver entre 1 e 10, mas não for um número primo?
Adicione outra ramificação com a palavra-chave in:
- Depois da primeira ramificação da instrução
when, adicione uma segunda ramificação com a palavra-chavein, seguida por um intervalo1..10e um corpoprintln("x is a number between 1 and 10, but not a prime number."):
fun main() {
val x = 3
when (x) {
2, 3, 5, 7 -> println("x is a prime number between 1 and 10.")
in 1..10 -> println("x is a number between 1 and 10, but not a prime number.")
else -> println("x isn't a prime number between 1 and 10.")
}
}
- Mude a variável
xpara um valor4:
fun main() {
val x = 4
when (x) {
2, 3, 5, 7 -> println("x is a prime number between 1 and 10.")
in 1..10 -> println("x is a number between 1 and 10, but not a prime number.")
else -> println("x isn't a prime number between 1 and 10.")
}
}
- Execute o programa e verifique o resultado:
x is a number between 1 and 10, but not a prime number.
O programa mostra a mensagem da segunda ramificação, mas não a mensagem da primeira ou da terceira.
Veja como esse programa funciona:
- Um valor
4é atribuído à variávelx. - O programa avalia as condições da primeira ramificação. O valor
4não é o valor2,3,5ou7. Por isso, o programa ignora a execução do corpo da primeira ramificação e passa para a segunda. - O valor
4está entre1e10, então a mensagem do corpox is a number between 1 and 10, but not a prime number.é mostrada. - Um corpo foi executado, então o programa sai da instrução
whene ignora a ramificaçãoelse.
Usar a palavra-chave is para verificar o tipo de dados
É possível usar a palavra-chave is como uma condição para verificar o tipo de dados de um valor avaliado.

No diagrama anterior, se o valor do argumento for do tipo de dados declarado, o primeiro corpo é executado.
No programa de números primos, é possível mostrar uma mensagem se a entrada for um número inteiro fora do intervalo de 1 a 10?
Adicione outra ramificação com a palavra-chave is:
- Modifique
xpara ser do tipoAny. Isso serve para indicar quexpode ter um valor diferente deInt.
fun main() {
val x: Any = 4
when (x) {
2, 3, 5, 7 -> println("x is a prime number between 1 and 10.")
in 1..10 -> println("x is a number between 1 and 10, but not a prime number.")
else -> println("x isn't a prime number between 1 and 10.")
}
}
- Depois da segunda ramificação da instrução
when, adicione a palavra-chaveise um tipo de dadosIntcom um corpoprintln("x is an integer number, but not between 1 and 10."):
fun main() {
val x: Any = 4
when (x) {
2, 3, 5, 7 -> println("x is a prime number between 1 and 10.")
in 1..10 -> println("x is a number between 1 and 10, but not a prime number.")
is Int -> println("x is an integer number, but not between 1 and 10.")
else -> println("x isn't a prime number between 1 and 10.")
}
}
- Na ramificação
else, mude o corpo paraprintln("x isn't an integer number.").
fun main() {
val x: Any = 4
when (x) {
2, 3, 5, 7 -> println("x is a prime number between 1 and 10.")
in 1..10 -> println("x is a number between 1 and 10, but not a prime number.")
is Int -> println("x is an integer number, but not between 1 and 10.")
else -> println("x isn't an integer number.")
}
}
- Mude a variável
xpara um valor20:
fun main() {
val x: Any = 20
when (x) {
2, 3, 5, 7 -> println("x is a prime number between 1 and 10.")
in 1..10 -> println("x is a number between 1 and 10, but not a prime number.")
is Int -> println("x is an integer number, but not between 1 and 10.")
else -> println("x isn't an integer number.")
}
}
- Execute o programa e verifique o resultado:
x is an integer number, but not between 1 and 10.
O programa mostra a mensagem da terceira ramificação, mas não as mensagens da primeira, segunda ou quarta ramificações.

O programa funciona desta forma:
- Um valor
20é atribuído à variávelx. - O programa avalia as condições da primeira ramificação. O valor
20não é um dos valores2,3,5ou7. Por isso, o programa ignora a execução do corpo da primeira ramificação e passa para a segunda ramificação. - O valor
20não está dentro do intervalo de1a10. Por isso, o programa ignora a execução do corpo da segunda ramificação e passa para a terceira ramificação. - O valor
20é do tipoInt, então o corpox is an integer number, but not between 1 and 10é mostrado. - Um corpo foi executado, então o programa sai da instrução
whene ignora a ramificaçãoelse.
Testar
Agora, pratique o que você aprendeu no programa de semáforo.
Imagine que há uma cor de semáforo âmbar em alguns países que alerta os motoristas da mesma forma que um semáforo amarelo em outros países. Você pode modificar o programa para que essa condição adicional seja coberta mantendo as condições originais?
Adicionar outra condição com o mesmo corpo
Adicione outra condição ao programa de semáforo:
- Volte para a instância do Playground Kotlin com o programa de semáforo se ela ainda estiver aberta.
- Se você tiver fechado a página, abra uma nova instância do Playground Kotlin e insira este código:
fun main() {
val trafficLightColor = "Yellow"
when (trafficLightColor) {
"Red" -> println("Stop")
"Yellow" -> println("Slow")
"Green" -> println("Go")
else -> println("Invalid traffic-light color")
}
}
- Na segunda ramificação da instrução
when, adicione uma vírgula após a condição"Yellow"e uma condição"Amber":
fun main() {
val trafficLightColor = "Yellow"
when (trafficLightColor) {
"Red" -> println("Stop")
"Yellow", "Amber" -> println("Slow")
"Green" -> println("Go")
else -> println("Invalid traffic-light color")
}
}
- Mude a variável
trafficLightColorpara um valor"Amber":
fun main() {
val trafficLightColor = "Amber"
when (trafficLightColor) {
"Red" -> println("Stop")
"Yellow", "Amber" -> println("Slow")
"Green" -> println("Go")
else -> println("Invalid traffic-light color")
}
}
- Execute este programa e verifique o resultado:
Slow
4. Usar if/else e when como expressões
Você aprendeu a usar if/else e when como instruções. Ao usar condicionais como instruções, você permite que cada ramificação execute ações diferentes no corpo de acordo com as condições.
Também é possível usar condicionais como expressões e retornar valores diferentes para cada ramificação de condição. Quando o corpo de cada ramificação for semelhante, você pode usar expressões condicionais para melhorar a legibilidade do código em comparação com instruções condicionais.

A sintaxe de condicionais como expressões é semelhante às instruções, mas a última linha dos corpos em cada ramificação precisa retornar um valor ou uma expressão e os condicionais são atribuídos a uma variável.
Se os corpos tiverem apenas uma expressão ou um valor de retorno, é possível remover as chaves para deixar o código mais conciso.

Na próxima seção, você vai ver as expressões if/else no programa de semáforo.
Converter uma instrução if em uma expressão
Há muitas repetições de println() nesta instrução if/else:
fun main() {
val trafficLightColor = "Black"
if (trafficLightColor == "Red") {
println("Stop")
} else if (trafficLightColor == "Yellow") {
println("Slow")
} else if (trafficLightColor == "Green") {
println("Go")
} else {
println("Invalid traffic-light color")
}
}
Converta a instrução if/else em uma expressão if/else e remova a repetição:
- No Playground Kotlin, abra o programa de semáforo anterior.
- Defina uma variável
messagee atribua uma instruçãoif/elsea ela:
fun main() {
val trafficLightColor = "Black"
val message = if (trafficLightColor == "Red") {
println("Stop")
} else if (trafficLightColor == "Yellow") {
println("Slow")
} else if (trafficLightColor == "Green") {
println("Go")
} else {
println("Invalid traffic-light color")
}
}
- Remova todas as instruções
println()e as chaves, mas deixe os valores dentro delas:
fun main() {
val trafficLightColor = "Black"
val message =
if (trafficLightColor == "Red") "Stop"
else if (trafficLightColor == "Yellow") "Slow"
else if (trafficLightColor == "Green") "Go"
else "Invalid traffic-light color"
}
- Adicione uma instrução
println()ao final do programa e transmita a variávelmessagecomo um argumento:
fun main() {
val trafficLightColor = "Black"
val message =
if (trafficLightColor == "Red") "Stop"
else if (trafficLightColor == "Yellow") "Slow"
else if (trafficLightColor == "Green") "Go"
else "Invalid traffic-light color"
println(message)
}
- Execute o programa e veja o resultado:
Invalid traffic-light color
Testar
Converta o programa de semáforo para usar uma expressão when em vez de uma instrução when:
- No Playground Kotlin, digite este código:
fun main() {
val trafficLightColor = "Amber"
when (trafficLightColor) {
"Red" -> println("Stop")
"Yellow", "Amber" -> println("Slow")
"Green" -> println("Go")
else -> println("Invalid traffic-light color")
}
}
É possível converter a instrução when em uma expressão para não repetir as instruções println()?
- Crie uma variável
messagee a atribua à expressãowhen:
fun main() {
val trafficLightColor = "Amber"
val message = when(trafficLightColor) {
"Red" -> "Stop"
"Yellow", "Amber" -> "Slow"
"Green" -> "Go"
else -> "Invalid traffic-light color"
}
}
- Adicione uma instrução
println()como a última linha do programa e transmita a variávelmessagecomo um argumento:
fun main() {
val trafficLightColor = "Amber"
val message = when(trafficLightColor) {
"Red" -> "Stop"
"Yellow", "Amber" -> "Slow"
"Green" -> "Go"
else -> "Invalid traffic-light color"
}
println(message)
}
5. Conclusão
Parabéns! Você aprendeu sobre condicionais e como criá-los em Kotlin.
Resumo
- Em Kotlin, a ramificação pode ser feita com condicionais
if/elseouwhen. - O corpo de uma ramificação
ifem um condicionalif/elseé executado apenas quando a expressão booleana dentro da condiçãoifda ramificação retorna um valortrue. - As ramificações
else ifseguintes em um condicionalif/elsesão executadas somente quando ramificaçõesifouelse ifanteriores retornam valoresfalse. - A ramificação
elsefinal em um condicionalif/elsesó é executada quando todas as ramificaçõesifouelse ifanteriores retornam valoresfalse. - É recomendável usar o condicional
whenpara substituir um condicionalif/elsequando há mais de duas ramificações. - É possível escrever condições mais complexas em condicionais
whencom vírgulas (,), intervalosine a palavra-chaveis. - Os condicionais
if/elseewhenpodem funcionar como instruções ou expressões.
Saiba mais
- Condições e loops (link em inglês)
