Operador Ternário
Agora que discutimos as declarações if-then-else, podemos retornar brevemente à nossa discussão sobre operadores e apresentar o último operador que você precisa aprender para o exame. O operador condicional, ? : , também conhecido como o operador ternário, é o único operador que leva três operandos e é declarado da seguinte da forma:
booleanExpression ? expression1 : expression2
O primeiro operando deve ser uma expressão booleana, e o segundo e terceiro podem ser qualquer expressão que retorna um valor. A operação ternária é realmente uma forma condensada de uma declaração if then-else que retorna um valor. Por exemplo, os dois trechos de código a seguir são equivalentes:
int y = 10;
final int x;
if(y > 5) {
x = 2 * y;
} else {
x = 3 * y;
}
Compare o trecho de código anterior com o seguinte trecho de código de operador ternário equivalente:
int y = 10;
int x = (y > 5) ? (2 * y) : (3 * y);
Observe que geralmente é útil para a leitura incluir parênteses em torno das expressões em operações ternárias, embora não seja necessário.
Não há exigência de que as segundas e terceiras expressões em operações ternárias tenham os mesmos tipos de dados, embora possam entrar em execução quando combinadas com o operador de atribuição. Compare as duas instruções a seguir:
System.out.println((y > 5) ? 21 : "Zebra");
int animal = (y < 91) ? 9 : "Horse"; // DOES NOT COMPILE
Ambas as expressões avaliam valores booleanos semelhantes e retornam um int e um String, embora apenas a primeira linha seja compilada. O System.out.println() não se importa que as instruções sejam tipos completamente diferentes, porque ele pode converter ambos em String. Por outro lado, o compilador sabe que "Horse" é do tipo de dados incorreto e não pode ser atribuído a um int; Portanto, não permitirá que o código seja compilado.
Avaliação da Expressão Ternária
A partir do Java 7, apenas uma das expressões à direita do operador ternário será avaliada no tempo de execução. De maneira semelhante aos operadores de curto-circuito, se uma das duas expressões à direita em um operador ternário executa um efeito colateral, ele pode não ser aplicado no tempo de execução. Vamos ilustrar esse princípio com o seguinte exemplo:
int y = 1;
int z = 1;
final int x = y<10 ? y++ : z++;
System.out.println(y+","+z); // Outputs 2,1
Observe que, como a expressão booleana da esquerda era verdadeira, somente y era incrementado. Compare o exemplo anterior com a seguinte modificação:
int y = 1;
int z = 1;
final int x = y>=10 ? y++ : z++;
System.out.println(y+","+z); // Outputs 1,2
Agora que a expressão booleana da esquerda é avaliada como falsa, apenas z foi incrementado. Desta maneira, vemos como as expressões em um operador ternário não podem ser aplicadas se a expressão particular não for usada.
Para o exame, tenha cuidado com qualquer questão que inclua uma expressão ternária na qual uma variável é modificada em uma das expressões do lado direito.