¿Cómo se llama el operador Java?: y ¿qué hace?
He estado trabajando con Java durante un par de años, pero hasta hace poco no me había encontrado con esta construcción:
int count = isHere ? getHereCount(index) : getAwayCount(index);
Probablemente esta sea una pregunta muy simple, pero ¿alguien puede explicarla? ¿Cómo lo leo? Estoy bastante seguro de saber cómo funciona.
- si
isHere
es cierto,getHereCount()
se llama, - si
isHere
es falsogetAwayCount()
se llama.
¿Correcto? ¿Cómo se llama esta construcción?
Sí, es una forma abreviada de
int count;
if (isHere)
count = getHereCount(index);
else
count = getAwayCount(index);
Se llama operador condicional . Mucha gente (erróneamente) lo llama operador ternario , porque es el único operador ternario (de tres argumentos) en Java, C, C++ y probablemente en muchos otros lenguajes. Pero, en teoría , podría haber otro operador ternario, mientras que sólo puede haber un operador condicional .
El nombre oficial aparece en la Especificación del lenguaje Java :
§15.25 ¿Operador condicional? :
El operador condicional
? :
utiliza el valor booleano de una expresión para decidir cuál de las otras dos expresiones debe evaluarse.
Tenga en cuenta que ambas ramas deben conducir a métodos con valores de retorno:
Es un error en tiempo de compilación que la segunda o tercera expresión de operando sea una invocación de un método nulo.
De hecho, según la gramática de las declaraciones de expresión ( §14.8 ), no está permitido que aparezca una expresión condicional en ningún contexto donde pueda aparecer una invocación de un método nulo.
Entonces, si doSomething()
y doSomethingElse()
son métodos nulos, no puedes comprimir esto:
if (someBool)
doSomething();
else
doSomethingElse();
dentro de esto:
someBool ? doSomething() : doSomethingElse();
Palabras simples:
booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse
Otros han respondido a esto en una medida razonable, pero a menudo con el nombre de "operador ternario".
Siendo lo pedante que soy, me gustaría dejar claro que el nombre del operador es operador condicional u "operador condicional?:". Es un operador ternario (ya que tiene tres operandos) y resulta ser el único operador ternario en Java en este momento.
Sin embargo, la especificación es bastante clara : su nombre es operador condicional u "operador condicional ?:" para ser absolutamente inequívoco. Creo que es más claro llamarlo por ese nombre, ya que indica el comportamiento del operador hasta cierto punto (evaluar una condición) en lugar de solo cuántos operandos tiene.
Según la especificación Sun Java , se denomina operador condicional. Ver sección 15.25. Tienes razón en cuanto a lo que hace.
¿El operador condicional? : utiliza el valor booleano de una expresión para decidir cuál de las otras dos expresiones debe evaluarse.
El operador condicional es sintácticamente asociativo por la derecha (agrupa de derecha a izquierda), de modo que a?b:c?d:e?f:g significa lo mismo que a?b:(c?d:(e?f :gramo)).
ConditionalExpression:
ConditionalOrExpression
ConditionalOrExpression ? Expression : ConditionalExpression
El operador condicional tiene tres expresiones de operandos; ? aparece entre la primera y la segunda expresión, y : aparece entre la segunda y la tercera expresión.
La primera expresión debe ser de tipo booleano o booleano, o se producirá un error en tiempo de compilación.
condition ? truth : false;
Si la condición es true
entonces evalúe la primera expresión. Si la condición es false
, evalúe la segunda expresión.
Se llama Operador Condicional y es un tipo de Operación Ternaria .
int count = isHere ? getHereCount(index) : getAwayCount(index);
medio :
if (isHere) {
count = getHereCount(index);
} else {
count = getAwayCount(index);
}