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 |
|---|---|
|
Instrução |
|
Expressão, tipo boolean |
|
Expressão, tipo coincide com o da variável i |
|
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
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;
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 | |
pré-escolar |
| 7–17 | |
escolar |
| 18–64 | |
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);
GO TO FULL VERSION