Operador Ternário em Java
Teste Condicional
Antes de abordar o que é Operador Ternário é bom enfatizar que no Java, como em outras linguagens de programação, temos o conceito de testes condicionais, que são estruturas baseadas em condições.
Uma definição simples para condição é o estado em que algo se encontra. Seguindo esta definição, as linguagens de programação criaram estruturas de testes para verificar se “algo” se encontra em um “estado” esperado ou não. Por exemplo, se um algoritmo tem uma variável do tipo inteiro com o valor 10 armazenado, como podemos saber se o valor realmente é 10? Fazemos isso testando com uma estrutura de teste condicional que pode ser do tipo if/else, switch/case ou operador ternário.
Teste condicional com if/else
Vamos agora entender como funciona o operador ternário, mas para isso, primeiro veremos um exemplo usando o teste condicional if/else:
String mensagem;
int idade = 18;
if (idade >= 18) {
mensagem = "Você já tem idade para dirigir.";
} else {
mensagem = "Você ainda não tem idade para dirigir.";
}
System.out.println(mensagem);
O bloco de código acima possui duas variáveis. A mensagem
será aquela que vai armazenar o valor resultante dos testes condicionais. Para que a variável mensagem receba o valor referente é preciso que o teste condicional seja verdadeiro. Esses testes serão realizado em cima da variável idade
que foi inicializada com o valor 18
.
O bloco condicional apresentado possui um if
com a condição que verifica se o valor contido em idade é maior ou igual a 18
. Se for verdadeiro, então a variável mensagem
vai receber um texto e este será exibido na tela pela última linha de código. Caso o teste seja falso, o else
será automaticamente verdadeiro e assim, a mensagem dizendo de que não se tem idade para dirigir será atribuída a variável mensagem
e impressa na tela pela última instrução.
Agora podemos ver como funciona o operador ternário.
Operador Ternário
Seguindo o exemplo anterior, que verifica se a idade habilita alguém a dirigir, vamos converter o teste if/else
em um teste condicional por operador ternário:
int idade = 18;
String mensagem = idade >= 18
? "Você já tem idade para dirigir."
: "Você ainda não tem idade para dirigir.";
System.out.println(mensagem);
Observe no código acima que temos a variável mensagem. Ela será atribuída pelo retorno da resposta obtida pelo teste condicional.
A primeira instrução, a direita do operador de atribuição, é a condição. Depois temos dois operadores importantes que são ?
e o :
.
O ?
é a instrução que será executada quando o teste condicional for verdadeiro. Já o operador :
será executado quando o teste condicional for falso.
Outro ponto importante no Operador Ternário é que esse tipo de teste obrigatoriamente precisa retornar algo. Por exemplo, vc não poderia ter como retorno da operação um System.out.print()
. É por esse motivo que o teste está sendo atribuído a variável mensagem
.
Resumindo, o operador condicional do tipo ternário possui três operandos que são a condição, um valor para a expressão avaliada como verdadeira e um valor para a expressão avaliada como falsa:
condição ? expressão Verdadeira : expressão Falsa
Se a condição retorna true
o operador retornará o valor da expressão verdadeira
. Senão, ele retorna o valor da expressão falsa
.
Exemplos com operador ternário
Vamos supor que seu algoritmo precisa calcular um bônus sobre o salário do funcionário. Esse bônus será dado perante algumas condições. Caso o funcionário tenha até 3 anos de empresa deve receber 5% de bônus, caso tenha mais de 3 anos deve receber 7%:
double tempoDeServico = 6;
double salario = 1000.00;
double bonus = tempoDeServico <= 3
? salario * 0.05
: salario * 0.07;
System.out.printf("salário + bonus = %.2f: ", (salario + bonus));
E se fosse preciso incluir mais uma condição? Por exemplo, ao invés de dar 7% a todos os funcionários com mais de 3 anos de serviço, dar 7% para os funcionários com 3 a 5 anos de empresa e 10% a todos acima de 5 anos. Para isso, pode incluir um teste adicional no local da expressão falsa
e em seguida adicionar uma expressão verdadeira
e outra expressão falsa
:
double bonus = tempoDeServico <= 3
? salario * 0.05
: tempoDeServico > 3 && tempoDeServico <= 5
? salario * 0.07
: salario * 0.10;
Qual a lógica por trás deste teste?
Primeiro temos o teste condicional, se ele for verdadeiro o calculo será executado. Porém, se o teste for falso, um novo teste será executado e o que resultar deste teste, seja ele verdadeiro ou falso, é que será o retornado para a variável bonus
.
A cada nova expressão falsa é possível adicionar um novo teste condicional, desde que, ele seja seguido por uma expressão verdadeira
e uma expressão falsa
. Mas é importante avaliar se a inclusão de vários testes condicionais irão deixar sua operação mais e mais complicada. Lembre-se que o ideal é ter uma lógica simples de entender, tanto para você quanto para qualquer outro programador da sua equipe que irá trabalhar nesse código fonte. Talvez, ao invés de usar muitas condições o ideal se voltar a usar uma cadeia tradicional de if/else
.