CodeGym /Cursos /JAVA 25 SELF /Operador ternário em Java: condições concisas e nuances

Operador ternário em Java: condições concisas e nuances

JAVA 25 SELF
Nível 3 , Lição 5
Disponível

1. Expressões vs instruções

Em Java, todo código se divide em duas categorias: instruções (Statement) e expressões (Expression). Costuma-se dizer que uma instrução é executada, enquanto uma expressão é avaliada. Mas isso não é o principal.

A principal diferença entre uma instrução e uma expressão é que uma expressão tem um resultado de avaliação. Esse resultado, em primeiro lugar, tem um tipo e, em segundo lugar, pode ser atribuído a algum lugar ou usado em outra expressão.

Exemplos:

Código Observações
int x;
Instrução
(a < 10)
Expressão, tipo boolean
i++;
Expressão, tipo coincide com o da variável i
x = 5;
Expressão, tipo coincide com o da variável x

E o que isso nos dá?

Em primeiro lugar, podemos aproveitar o fato de que muitas instruções na verdade são expressões (têm um resultado). Por exemplo, o código a seguir funciona:

int x, y, z; 
x = y = z = 1; 	// x = (y = (z = 1));

Em segundo lugar, podemos ignorar o resultado da avaliação de uma expressão, se quisermos.

console.nextLine();	// ignoramos o resultado da entrada

Ignorar o resultado de uma expressão é útil, por exemplo, quando a expressão, além do resultado, faz algo útil, e essa ação é importante para nós, mas o próprio resultado não é.

2. Operador ternário

Operador ternário em Java

Esta dica é um pouco mais interessante do que a anterior. Em Java existe um operador especial ternário (triplo). De certa forma, ele se parece com uma forma abreviada do operador if–else:


Condição ? Expressão1 : Expressão2;
Sintaxe do operador ternário

Se a condição for verdadeira, então é avaliada a expressão1; caso contrário, é avaliada a expressão2. Após a condição vem o ponto de interrogação, e as duas expressões são separadas por dois pontos.

A principal diferença do operador ternário para o operador if-else é que o operador ternário é uma expressão e, portanto, seu resultado pode ser atribuído a alguma coisa.

Por exemplo, queremos calcular o mínimo de dois números. Usando o operador ternário, esse código fica assim:

int a = 2;
int b = 3;
int min = a < b ?  a : b;

Ou, digamos, que você precise atribuir valores diferentes a uma variável dependendo de alguma condição. Como fazer isso?

Primeira opção — usar o operador if-else:

int age = 25;
int money;
if (age > 30)
   money = 100;
else
   money = 50;

Segunda opção — usar o operador ternário, ou seja, a forma abreviada do operador if-else:

int age = 25;
int money = age > 30 ? 100 : 50;

Então, o que é melhor usar: o operador if-else ou o operador ternário? Do ponto de vista de desempenho, não há grande diferença. Aqui é mais uma questão de legibilidade do código. E isso é muito importante: o código deve não apenas funcionar corretamente, mas também ser fácil de ler por outros programadores.

O critério mais simples pode ser este: se o código couber em uma linha — use o operador ternário; se já não couber em uma linha — é melhor usar if-else.

3. Nuances de funcionamento

Tipos de valores

É importante lembrar: ambos os ramos do operador ternário (<valor_se_verdadeiro> e <valor_se_falso>) devem ser do mesmo tipo ou compatíveis (por exemplo, ambos String ou ambos int).

Funciona:

int a = 10, b = 20;
int max = (a > b) ? a : b; // ambos os ramos — int

Erro de compilação:

int a = 10, b = 20;
// String e int são incompatíveis
String result = (a > b) ? "maior" : 0; // Erro de compilação: não é possível atribuir um int a uma variável do tipo String

Opção correta:

int a = 10, b = 20;
String result = (a > b) ? "maior" : "menor ou igual";

Exemplo: trabalhando com números

Vamos calcular o valor absoluto com o operador ternário:

int number = -5;
int abs = (number >= 0) ? number : -number;
System.out.println(abs); // 5

4. Incorporando o operador ternário no aplicativo

Vamos escrever um pequeno aplicativo de diálogo: além da saudação, o programa dirá ao usuário quantos anos ele terá no próximo ano e indicará se será maior de idade.

System.out.print("Digite seu nome: ");
String name = console.nextLine();

System.out.print("Digite sua idade: ");
int age = console.nextInt();

int nextYear = age + 1;
String status = (nextYear >= 18) ? "maior de idade" : "menor de idade";

System.out.println("Olá, " + name + "! No próximo ano você terá " + nextYear + ". Você será " + status + ".");

Vamos explicar os detalhes:

A variável status é calculada por meio do operador ternário: se a idade no próximo ano for pelo menos 18, então o usuário será maior de idade (ou continuará sendo).

5. Operadores ternários aninhados — cuidado!

O operador ternário pode ser aninhado (em cada ramo pode haver outro ternário). Mas… isso geralmente dá dor de cabeça, especialmente para quem vai ler o código depois de você (mesmo que seja você daqui a 2 dias).

Exemplo: determinação de categoria por idade

String category = (age < 7) ? "pré-escolar" :
                  (age < 18) ? "escolar" :
                  (age < 65) ? "adulto" : "aposentado";

Tabela de decisão:

Idade Condição Resultado
< 7
age < 7
pré-escolar
7–17
age < 18
escolar
18–64
age < 65
adulto
65 e mais caso contrário aposentado

Esse código ainda dá para ler, mas se a lógica for mais complexa — é melhor usar if-else if-else.

6. Dica: operador ternário e o tipo boolean

Às vezes é comum escrever uma expressão do tipo:

boolean adult = (age >= 18) ? true : false;

Mas isso é redundante. A própria expressão (age >= 18) já retorna boolean. Portanto, pode ser reduzida para:

boolean adult = (age >= 18);
1
Pesquisa/teste
Operador condicional, nível 3, lição 5
Indisponível
Operador condicional
Operador condicional: if else
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION