Qual é o Java:? Operador chamado eo que ele faz?
-
18-09-2019 - |
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
é falsagetAwayCount()
é chamado.
Correto? O que é esta construção chamada?
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:
- se isHere é verdade, o Resultado de getHereCount () é retornou
- 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.
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