O que é o operador ternário?

No desenvolvimento de uma aplicação, é muito comum utilizarmos estruturas condicionais como, por exemplo, ifs e elses ou switch case. Porém, em algum momento da nossa vida, provavelmente, um desses testes que realizamos é tão simples que retorna um valor para apenas duas possibilidades.

Por exemplo, suponhamos que precisamos criar uma funcionalidade para gerar uma bonificação e a regra para essa funcionalidade é a seguinte:

  • Se o salário for maior que R$ 1000, o bônus é de 10%
  • Se o salário for menor ou igual a R$ 1000, o bônus é de 15%

Uma solução seria utilizar um if e else como já conhecemos, como por exemplo no Java:

double salario = 1000;
double bonus = 0.0;

if (salario > 1000) {
     bonus = salario * 0.10;
} else {
     bonus = salario * 0.15;
}

System.out.println(bonus);

Nesse exemplo o resultado é 150.0 pois o salário é menor que R$ 1000.0, ou seja, bônus de 15%.

Entretanto, perceba que o que estamos fazendo é apenas um teste bem básico que tem apenas uma única linha de código dentro do if ou do else. Será que não existe uma maneira mais simples de resolver o mesmo problema?

Em um cenário similar a esse, podemos também utilizar o operador ternário que funciona com o mesmo conceito do if e else, porém, a única diferença é que precisamos devolver um valor após o teste estritamente em uma única linha!

double salario = 1000;
double bonus = salario * (salario > 1000 ? 0.10 : 0.15);
System.out.println(bonus);

Com esse código acima temos o mesmo resultado de antes, ou seja, 150.0. Mas como funciona esse operador ternário? A estrutura de um operador ternário é compreendida da seguinte forma:

condição? valor se for verdareiro : valor se for falso

Portanto, inicialmente temos um teste (podemos adicionar um teste qualquer), ou seja, qualquer teste devolve um valor booleano, então, definimos o primeiro parâmetro que é justamente o valor que será retornado caso o teste for verdadeiro e o segundo que será retornado caso for falso!

Justamente pelo fato de realizar essas 3 operações, o chamamos de operador ternário. Mas isso é só em Java? Não! Diversas linguagens implementam esse mesmo recurso! Vejamos alguns exemplos:

C:

double salario = 1000;
double bonus = salario * (salario > 1000 ? 0.10 : 0.15);

Ruby:

salario = 1000;
bonus = salario * (salario > 1000 ? 0.10 : 0.15);

C#:

double salario = 1000;
double bonus = salario * (salario > 1000 ? 0.10 : 0.15);

JavaScript:

var salario = 1000;
var bonus = salario * (salario > 1000 ? 0.10 : 0.15);

PHP:

$salario = 1000;
$bonus = $salario * ($salario > 1000 ? 0.10 : 0.15);

Observe que mesmo sendo linguagens diferentes, o recurso do operador ternário contém a mesma estrutura! Entretanto, em algumas linguagens de programação, temos algumas variantes, ou seja, o mesmo conceito do operador ternário que vimos, porém, com algumas diferenças na syntax. Vejamos alguns exemplos:

Lua

salario = 1000
bonus = salario * (salario > 1000 and 0.10 or 0.15)

fortran

salario = 1000
bonus = salario * merge(0.10, 0.15, salario > 1000)	

Achou interessante? Então dê uma olhada na quantidade de operadores ternários que a linguagem python nos fornece resolvendo o mesmo problema:

salario = 1000

bonus = salario * (lambda:0.15, lambda:0.10)[salario > 1000]()
bonus = salario * (0.15, 0.10)[salario > 1000]
bonus = salario * {True: 0.10, False: 0.15}[salario > 1000]
bonus = salario * ((salario > 1000) and 0.10 or 0.15)

Entretanto, é sempre importante lembrar que a utilização dessas variantes do operador ternário pode ser problemático, pois dificulta a compreensão de desenvolvedores que não estão acostumados ou simplesmente não conhece.

Portanto, recomendamos que evite o máximo possível a utilização dessas variantes. O que achou do operador ternário? Está pronto para utilizá-lo no seu próximo algoritmo?

Que tal aprender mais sobre programação? Na Alura, temos diversos cursos online de programação de diversas linguagens! Abordamos o conteúdo desde cursos mais introdutórios, como introdução a lógica com JavaScript a cursos de desenvolvimento de aplicações para dispositivo móveis (Android e iOS) ou aplicações web.

Fique por dentro

(Última atualização em: 20 de janeiro de 2017)

Content Editor at Alura and Software Developer

  • Jonatas Ramos Domingos

    Costumo usar o operador ternário dentro do iReport para realizar as condições…
    Exemplo com mais de uma condição:
    (!$F{CAMPO}.equals(“000001”) ? ($V{PAGE_NUMBER}.toString().equals(“1”) ? “CONDIÇÃO 1” : ($V{PAGE_NUMBER}.toString().equals(“3”) ? “CONDIÇÃO 2” : “”) ) : “”)

    • Alex Felipe

      Caraca! Haja coragem! Embora seja bem enxuto, a primeira vista, não é fácil de entender o que acontece, por isso é recomendado que não utilize tanta lógica “complexa” em um operador ternário. Já vi outros parecidos com o seu Jonatas envolvendo recursão e muito mais haha. Muito bom! 🙂

      • Jonatas Ramos Domingos

        Muito confuso! Infelizmente dentro da ferramenta iReport na versão utilizada aqui é o que da pra fazer…
        Utilizo em função JavaScript também mas em contexto com duas condições, bem simples, como explicado no post.

        • Alex Felipe

          Exatamente, a ideia é justamente essa, para coisas simples faz todo o sentido!

Próximo ArtigoEvitando SQL Injection com PHP