O que é o operador Java?: Chamado e o que ele faz?

Eu tenho trabalhado com Java há alguns anos, mas até recentemente eu não encontrei este constructo:

int count = isHere ? getHereCount(index) : getAwayCount(index); 

Esta é provavelmente uma pergunta muito simples, mas alguém pode explicar isso? Como eu leio? Tenho certeza que sei como funciona.

  • se isHere for true, getHereCount() é chamado,
  • if isHere é false getAwayCount() é chamado.

Corrigir? O que é esse constructo chamado?

    Sim, é uma forma abreviada de

     int count; if (isHere) count = getHereCount(index); else count = getAwayCount(index); 

    É chamado de operador condicional . Muitas pessoas (erroneamente) o chamam de operador ternário , porque é o único operador ternário (três argumentos) em Java, C, C ++ e provavelmente em muitas outras linguagens. Mas, teoricamente, poderia haver outro operador ternário, ao passo que só pode haver um operador condicional .

    O nome oficial é dado na especificação da linguagem Java :

    §15.25 Operador Condicional? :

    O operador condicional ? : ? : usa o valor booleano de uma expressão para decidir qual das outras duas expressões deve ser avaliada.

    Observe que as duas ramificações devem levar a methods com valores de retorno:

    É um erro em tempo de compilation para a expressão do segundo ou terceiro operando ser uma invocação de um método vazio.

    De fato, pela gramática das declarações de expressão ( §14.8 ), não é permitido que uma expressão condicional apareça em qualquer contexto em que uma invocação de um método vazio possa aparecer.

    Então, se doSomething() e doSomethingElse() forem methods vazios, você não pode comprimir isto:

     if (someBool) doSomething(); else doSomethingElse(); 

    nisso:

     someBool ? doSomething() : doSomethingElse(); 

    Palavras simples:

     booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse 

    Outros responderam isso na medida do razoável, mas muitas vezes com o nome “operador ternário”.

    Sendo o pedante que sou, gostaria de deixar claro que o nome do operador é o operador condicional ou “operador condicional?:”. É um operador ternário (com três operandos) e é o único operador ternário em Java no momento.

    No entanto, a especificação é bastante clara que seu nome é o operador condicional ou “operador condicional?:” Para ser absolutamente inequívoco. Eu acho que é mais claro chamá-lo por esse nome, já que indica o comportamento do operador até certo ponto (avaliando uma condição) em vez de quantos operandos ele possui.

    De acordo com a Especificação Sun Java , ela é chamada de Operador Condicional. Veja a seção 15.25. Você está certo sobre o que faz.

    O operador condicional? : usa o valor booleano de uma expressão para decidir qual das outras duas expressões deve ser avaliada.

    O operador condicional é associativamente sintaticamente à direita (agrupa da direita para a esquerda), de modo que a? B: c? D: e? F: g significa o mesmo que? B: (c? D: (e? F : g)).

     ConditionalExpression: ConditionalOrExpression ConditionalOrExpression ? Expression : ConditionalExpression 

    O operador condicional tem três expressões de operando; ? aparece entre a primeira e a segunda expressões e: aparece entre a segunda e a terceira expressões.

    A primeira expressão deve ser do tipo booleano ou booleano, ou ocorre um erro em tempo de compilation.

    Não exatamente correto, para ser preciso:

    1. se isHere for true, o resultado de getHereCount () será retornado
    2. otheriwse o resultado de getAwayCount () é retornado

    Isso “retornou” é muito importante. Isso significa que os methods devem retornar um valor e esse valor deve ser atribuído em algum lugar.

    Além disso, não é exatamente sintaticamente equivalente à versão if-else. Por exemplo:

     String str1,str2,str3,str4; boolean check; //... return str1 + (check ? str2 : str3) + str4; 

    Se codificado com if-else, sempre resultará em mais bytecode.

     int count = isHere ? getHereCount(index) : getAwayCount(index); 

    significa :

     if (isHere) { count = getHereCount(index); } else { count = getAwayCount(index); } 

    Esse constructo é chamado Operador Ternário em Técnicas de Ciência da Computação e Programação.
    E a Wikipedia sugere a seguinte explicação:

    Na ciência da computação, um operador ternário (algumas vezes incorretamente chamado de operador terciário) é um operador que aceita três argumentos. Os argumentos e resultados podem ser de diferentes tipos. Muitas linguagens de programação que usam syntax semelhante a C apresentam um operador ternário,?:, Que define uma expressão condicional.

    Não apenas em Java, esta syntax está disponível no PHP, o Objective-C também.

    No link a seguir, dá a seguinte explicação, que é boa para compreendê-lo:

    Um operador ternário é alguma operação operando em 3 inputs. É um atalho para uma instrução if-else e também é conhecido como um operador condicional.

    Em Perl / PHP funciona como:
    boolean_condition ? true_value : false_value

    Em C / C ++ funciona como:
    logical expression ? action for true : action for false

    Isso pode ser legível para algumas condições lógicas que não são muito complexas. Caso contrário, é melhor usar o bloco If-Else com a combinação pretendida de lógica condicional.

    Podemos simplificar os blocos If-Else com este operador Ternary para uma linha de declaração de código.
    Por exemplo:

     if ( car.isStarted() ) { car.goForward(); } else { car.startTheEngine(); } 

    Pode ser igual ao seguinte:

     ( car.isStarted() ) ? car.goForward() : car.startTheEngine(); 

    Então, se nos referimos ao seu depoimento:

     int count = isHere ? getHereCount(index) : getAwayCount(index); 

    Na verdade, é o equivalente a 100% do seguinte bloco If-Else :

     int count; if (isHere) { count = getHereCount(index); } else { count = getAwayCount(index); } 

    É isso aí!
    Espero que isso tenha sido útil para alguém!
    Felicidades!

     condition ? truth : false; 

    Se a condição for true , retorne o primeiro parâmetro. Se a condição for false , retorne o segundo parâmetro.

    É chamado de Operador Condicional e é um tipo de Operação Ternária .

    Ternário, condicional; tomate, tomate. O que é realmente valioso é a boot de variables. Se (como eu) você gosta de inicializar variables ​​onde elas são definidas, o operador ternário condicional (pois ambos são) permite que você faça isso nos casos em que houver condicionalidade sobre seu valor. Particularmente notável nos campos finais, mas também útil em outros lugares.

    por exemplo:

     public class Foo { final double value; public Foo(boolean positive, double value) { this.value = positive ? value : -value; } } 

    Sem esse operador – por qualquer nome – você teria que tornar o campo não final ou escrever uma function simplesmente para inicializá-lo. Na verdade, isso não está certo – ainda pode ser inicializado usando if / else, pelo menos em Java. Mas eu acho esse limpador.

    Corrigir. É chamado de operador ternário . Alguns também o chamam de operador condicional .

    Você pode estar interessado em uma proposta para alguns novos operadores que são semelhantes ao operador condicional. Os operadores com segurança nula ativarão o código da seguinte forma:

     String s = mayBeNull?.toString() ?: "null"; 

    Seria especialmente conveniente onde ocorre o desempacotamento automático.

     Integer ival = ...; // may be null int i = ival ?: -1; // no NPE from unboxing 

    Ele foi selecionado para uma análise mais detalhada na “Moeda do Projeto” do JDK 7.

    Seu Operador Ternário (? 🙂

     The ternary operator is an operator that takes three arguments. The first argument is a comparison argument, the second is the result upon a true comparison, and the third is the result upon a false comparison. 

    É o operador condicional e é mais do que apenas uma maneira concisa de escrever instruções if.

    Como é uma expressão que retorna um valor, ela pode ser usada como parte de outras expressões.

    Sim você está correto. ?: normalmente é chamado de “operador condicional ternário”, geralmente chamado de “operador ternário”. É uma versão abreviada do padrão if / else condicional.

    Operador condicional ternário

    Eu realmente gosto deste operador, mas o leitor deve ser levado em consideração.

    Você sempre tem que balancear a compacidade do código com o tempo gasto lendo-o e com algumas falhas bastante graves.

    Primeiro de tudo, há o caso do Asker Original. Ele só passou uma hora postando sobre isso e lendo as respostas. Quanto tempo mais demoraria o autor a escrever tudo?: Como se / então ao longo de toda a sua vida. Não uma hora para ter certeza.

    Em segundo lugar, nas linguagens C, você tem o hábito de simplesmente saber que as condicionais são a primeira coisa na linha. Eu percebi isso quando estava usando Ruby e me deparei com linhas como:

     callMethodWhatever(Long + Expression + with + syntax) if conditional 

    Se eu fosse um usuário Ruby muito tempo eu provavelmente não teria um problema com esta linha, mas vindo de C, quando você ver “callMethodWhatever” como a primeira coisa na linha, você espera que ela seja executada. O?: É menos enigmático, mas ainda incomum o suficiente para jogar um leitor fora.

    A vantagem, no entanto, é uma sensação muito legal em sua barriga quando você pode escrever uma declaração de 3 linhas se no espaço de 1 das linhas. Não posso negar isso 🙂 Mas honestamente, não necessariamente mais legível por 90% das pessoas lá fora, simplesmente por causa de sua ‘raridade.

    Quando é realmente uma atribuição baseada em um booleano e valores, não tenho problema com isso, mas pode ser facilmente abusada.