Pergunta

Eu tenho trabalhado com Java um par de anos, mas até recentemente eu não ter executado através esta construção:

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

Esta é provavelmente uma pergunta muito simples, mas alguém pode explicar isso? Como faço para ler? Eu tenho certeza que eu sei como funciona.

  • se isHere é verdade, getHereCount() é chamado,
  • se isHere é falsa getAwayCount() é chamado.

Correto? O que é esta construção chamada?

Foi útil?

Solução

Sim, é uma forma abreviada de

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

É o chamado operador condicional . Muitas pessoas (erroneamente) chamam de o operador ternário , porque é a única ternária (três argumentos) operador em Java, C, C ++, e provavelmente muitos outros idiomas. Mas, teoricamente, há pode ser outro operador ternário, ao passo que só pode haver um operador condicional .

O nome oficial é dada no Java Specification Language :

§15.25 operador condicional? :

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

Note-se que ambos os ramos devem levar a métodos com valores de retorno:

É um erro de tempo de compilação, quer para o segundo ou o terceiro expressão operando a ser uma chamada de um método vazio.

Na verdade, pela gramática de declarações de expressão ( §14.8 ), não é permitido para uma expressão condicional para aparecer em qualquer contexto onde uma invocação de um método vazio poderia aparecer.

Então, se doSomething() e doSomethingElse() são métodos vazios, você não pode comprimir isto:

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

a este:

someBool ? doSomething() : doSomethingElse();

Palavras simples:

booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse 

Outras dicas

Outros têm respondido a esta a medida razoável, mas muitas vezes com o nome "ternário operador".

Sendo o pedante que eu sou, eu gostaria de deixar claro que o nome do operador é o operador condicional ou "operador condicional:?". É de a operador ternário (na medida em que tem três operandos) e ele passa a ser o único operador ternário em Java no momento.

No entanto, a especificação é bastante limpar que seu nome é o operador condicional ou "operador condicional:" para ser absolutamente inequívoca. Eu acho que é mais claro para chamá-lo por esse nome, pois indica o comportamento do operador, até certo ponto (avaliação de uma condição), em vez de apenas quantos operandos que tem.

De acordo com a Sun Java Specification , ele é chamado o operador condicional. Veja a seção 15.25. Você está certo sobre o que ele faz.

O operador condicional? :. Usa o valor booleano de uma expressão para decidir qual das duas outras expressões devem ser avaliadas

O operador condicional é sintacticamente associativa à direita (TI grupos da direita para a esquerda), de modo que a b:? C d:? E F:? Meio de g o mesmo como um b:?? (C d :( e f:?. g))

ConditionalExpression:
        ConditionalOrExpression
        ConditionalOrExpression ? Expression : ConditionalExpression

O operador condicional tem três expressões operando; ? aparece entre os primeiros e segundos expressões, e:. aparece entre o segundo e terceiro expressões

A primeira expressão deve ser do tipo boolean ou booleano, ou um erro de tempo de compilação ocorre.

Não é exatamente correto, para ser mais preciso:

  1. se isHere é verdade, o Resultado de getHereCount () é retornou
  2. otheriwse o Resultado de getAwayCount () é retornou

Que "retornou" é muito importante. Isso significa que os métodos deve retornar um valor e que o valor deve em algum lugar ser atribuído.

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 vai resultar em mais bytecode.

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

meios:

if (isHere) {
    count = getHereCount(index);
} else {
    count = getAwayCount(index);
}
condition ? truth : false;

Se a condição é true em seguida, retornar o primeiro parâmetro. Se a condição for false, devolva o segundo parâmetro.

É o chamado operador condicional e é um tipo de ternário Operação .

ternário, condicional; tomate, tomatoh. O que é realmente valioso para é inicialização variável. Se (como eu) você gosta de inicialização de variáveis ??onde são definidos, o operador ternário condicional (para ele é ao mesmo tempo) permite que você faça isso em casos onde há condicionalidade sobre o seu valor. Particularmente notável em campos finais, mas útil em outros lugares também.

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 fazer o campo non-final ou escrever uma função simplesmente para inicializar-lo Na verdade, isso não é certo -. Ele ainda pode ser inicializado utilizando, se / else, pelo menos em Java. Mas eu acho isso mais limpo.

Esta construção é chamado Operador Ternário em técnicas de Ciências de Computação e de Programação.
E Wikipedia sugerem a seguinte explicação:

Em ciência da computação, um operador ternário (às vezes chamado incorretamente um operador terciário) é um operador que recebe três argumentos. Os argumentos e resultado pode ser de diferentes tipos. Muitas linguagens de programação que o uso C-como característica sintaxe um operador ternário,:?., Que define uma expressão condicional

Não só em Java, esta sintaxe está disponível dentro de PHP, Objective-C também.

No seguinte href="http://www.webopedia.com/TERM/T/ternary_operator.html" Ele dá a seguinte explicação, que é bom tranquila para compreendê-lo:

Um operador ternário é alguma operacional operação em 3 entradas. É 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 demasiado complexo caso contrário, é melhor usar bloco Else If- com a combinação pretendida de lógica condicional.

Podemos simplificar o if-else blocos com este operador ternário para a linha declaração um 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 nós nos referimos a sua declaração:

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

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

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

É isso aí!
Espero que este foi útil para alguém!
Felicidades!

Correto. É chamado ternário operador . Alguns também chamam a condicional operador .

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.

Você pode estar interessado em um para alguns novos operadores que são semelhantes para o operador condicional. Os operadores nulos-safe permitirá código como este:

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

Seria especialmente conveniente, onde auto-unboxing acontece.

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

Foi selecionados para uma análise mais aprofundada sob JDK 7 do "Coin Project".

Na verdade, pode demorar mais de 3 argumentos. Por exemplo, se queremos verificar wether um número é positivo, negativo ou zero, podemos fazer isso:

String m= num > 0 ? "is a POSITIVE NUMBER.": num < 0 ?"is a NEGATIVE NUMBER." :"IT's ZERO.";

que é melhor do que usar if, else if, else.

É o operador condicional, e é mais do que apenas uma maneira concisa de escrever se declarações.

Uma vez que é uma expressão que retorna um valor que pode ser usado como parte de outras expressões.

Sim, você está correto. ?: É normalmente chamado de "operador condicional ternário", muitas vezes referida como simplesmente "operador ternário". É uma versão abreviada do padrão if / else condicional.

ternário Conditional Operador

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

Você sempre tem que equilibrar compacidade de código com o tempo gasto lendo isso, e na medida em que tem algumas falhas muito graves.

Em primeiro lugar, há o caso do Asker Original. Ele só passou uma postagem horas sobre isso e ler as respostas. Como já teria que ter tomado o autor a escrever a cada:? Como se / então ao longo de toda a sua vida. Nem uma hora para ter certeza.

Em segundo lugar, no C-como idiomas, você tem o hábito de simplesmente saber que condicionais são a primeira coisa na linha. Percebi isso quando eu estava usando Ruby e me deparei com linhas como:

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

Se eu fosse um usuário do rubi muito tempo eu provavelmente não teria tido um problema com esta linha, mas vindo de C, quando você vê "callMethodWhatever" como a primeira coisa na linha, você espera que ele seja executado. A:?. É menos enigmática, mas o suficiente incomum ainda como para lançar um leitor off

A vantagem, no entanto, é um sentimento muito legal em sua barriga quando você pode escrever um 3-line if no espaço de 1 das linhas. Não podemos negar que :) Mas, honestamente, não necessariamente mais legível por 90% das pessoas lá fora, simplesmente por causa de sua raridade.

Quando se é verdadeiramente uma atribuição com base em um valor booleano e valores Eu não tenho um problema com ele, mas ele pode ser facilmente abusado.

As expressões condicionais estão em um estilo completamente diferente, sem explicitar se no comunicado.

A sintaxe é: boolean-expressão? expression1: expression2;

O resultado desta expressão condicional é

expression1, se boolean-expressão é verdadeiro;

caso contrário, o resultado é expressão2.

Suponha que você deseja atribuir o maior número de num1 variável e num2 ao máximo. Você pode simplesmente escrever uma declaração usando a expressão condicional: max = (num1> num2)? num1: num2;

Nota: Os símbolos? e: aparecem juntos em uma expressão condicional. Eles formam um operador condicional e também chamado de operador ternário, porque ele usa três operandos. É o único operador ternário em Java.

citou a partir de: Introdução à Programação Java edition 10 por Y. Daniel Liang página 126-127

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top