¿A qué se llama el operador Java? Y ¿qué hace?

He estado trabajando con Java hace un par de años, pero hasta hace poco no me había encontrado con este constructo:

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

Esta es probablemente una pregunta muy simple, pero ¿alguien puede explicarlo? ¿Cómo lo leo? Estoy bastante seguro de que sé cómo funciona.

  • si isHere es verdadero, se llama a getHereCount() ,
  • if isHere is false getAwayCount() es llamado.

¿Correcto? ¿Cómo se llama este constructo?

Sí, es una forma abreviada de

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

Se llama operador condicional . Muchas personas (erróneamente) lo llaman el operador ternario , porque es el único operador ternario (tres argumentos) en Java, C, C ++ y probablemente en muchos otros idiomas. Pero teóricamente podría haber otro operador ternario, mientras que solo puede haber un operador condicional .

El nombre oficial se da 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 twigs deben conducir a métodos con valores de retorno:

Es un error de tiempo de comstackción para la segunda o la tercera expresión de operando ser una invocación de un método de vacío.

De hecho, según la gramática de los enunciados de expresión ( §14.8 ), no está permitido que una expresión condicional aparezca en ningún contexto donde podría aparecer una invocación de un método vacío.

Entonces, si doSomething() y doSomethingElse() son métodos vacíos, no puedes comprimir esto:

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

dentro de esto:

 someBool ? doSomething() : doSomethingElse(); 

Palabras simples:

 booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse 

Otros han respondido esto en una medida razonable, pero a menudo con el nombre de “operador ternario”.

Siendo el pedante que soy, me gustaría dejar en claro que el nombre del operador es el operador condicional o “operador condicional”: “. Es un operador ternario (en el sentido de que tiene tres operandos) y resulta ser el único operador ternario en Java en este momento.

Sin embargo, la especificación es bastante clara de que su nombre es el operador condicional o “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 (evaluando una condición) en lugar de solo cuántos operandos tiene.

De acuerdo con la especificación de Sun Java , se llama operador condicional. Ver la 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 de 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 operando; ? 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 boolean o Boolean, o se produce un error en tiempo de comstackción.

No exactamente correcto, para ser precisos:

  1. si isHere es verdadero, se devuelve el resultado de getHereCount ()
  2. otheriwse se devuelve el resultado de getAwayCount ()

Ese “regreso” es muy importante. Significa que los métodos deben devolver un valor y ese valor debe asignarse en algún lugar.

Además, no es exactamente sintácticamente equivalente a la versión if-else. Por ejemplo:

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

Si está codificado con if-else siempre dará como resultado más bytecode.

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

significa:

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

Si la condición es true , devuelve el primer parámetro. Si la condición es false , devuelve el segundo parámetro.

Se llama operador condicional y es un tipo de operación ternaria .

Ternario, condicional; tomate, tomatoh. Para qué es realmente valioso es la inicialización variable. Si (como yo) le gusta inicializar las variables donde están definidas, el operador ternario condicional (para él es ambos) le permite hacer eso en los casos donde hay condicionalidad sobre su valor. Particularmente notable en los campos finales, pero útil también en otros lugares.

p.ej:

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

Sin ese operador, cualquiera que sea el nombre, tendrías que hacer que el campo no sea definitivo o escribir una función simplemente para inicializarlo. En realidad, eso no está bien, aún se puede inicializar usando if / else, al menos en Java. Pero me parece más limpio.

Esta construcción se llama Operador Ternario en Ciencias de la Computación y Técnicas de Progtwigción.
Y Wikipedia sugiere la siguiente explicación:

En informática, un operador ternario (a veces incorrectamente llamado operador terciario) es un operador que toma tres argumentos. Los argumentos y el resultado pueden ser de diferentes tipos. Muchos lenguajes de progtwigción que usan syntax similar a C presentan un operador ternario,?:, Que define una expresión condicional.

No solo en Java, esta syntax está disponible en PHP, Objective-C también.

En el siguiente enlace , da la siguiente explicación, que es muy bueno para entenderlo:

Un operador ternario es una operación que opera con 3 entradas. Es un atajo para una statement if-else, y también se conoce como un operador condicional.

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

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

Esto podría ser legible para algunas condiciones lógicas que no son demasiado complejas; de lo contrario, es mejor usar el bloque If-Else con la combinación deseada de lógica condicional.

Podemos simplificar los bloques If-Else con este operador Ternary para una línea de statement de código.
Por ejemplo:

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

Podría ser igual a lo siguiente:

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

Entonces, si nos referimos a su statement:

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

En realidad, es el 100% equivalente del siguiente bloque If-Else :

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

¡Eso es!
Espero que esto haya sido útil para alguien.
¡Aclamaciones!

Correcto. Se llama operador ternario . Algunos también lo llaman el operador condicional .

Es posible que le interese una propuesta para algunos operadores nuevos que son similares al operador condicional. Los operadores seguros de nulos permitirán código como este:

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

Sería especialmente conveniente cuando se lleva a cabo el desempaquetado automático.

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

Ha sido seleccionado para su posterior consideración en “Project Coin” de JDK 7.

Su operador ternario (? 🙂

 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. 

En realidad, puede llevar más de 3 argumentos. Por ejemplo, si queremos verificar si un número es positivo, negativo o cero, podemos hacer esto:

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

que es mejor que usar if, else if, else.

Es el operador condicional, y es más que una forma concisa de escribir declaraciones if.

Como es una expresión que devuelve un valor, puede usarse como parte de otras expresiones.

Sí, estás en lo correcto. ?: se llama típicamente el “operador condicional ternario”, a menudo denominado simplemente “operador ternario”. Es una versión abreviada del estándar if / else conditional.

Operador condicional ternario

Realmente me gusta este operador, pero el lector debe tenerse en cuenta.

Siempre tiene que equilibrar la compacidad del código con el tiempo dedicado a leerlo, y en eso tiene algunos defectos bastante severos.

En primer lugar, está el caso del Asker Original. Él solo pasó una hora publicando sobre eso y leyendo las respuestas. ¿Cuánto tiempo le habría tomado al autor escribir cada?: Como un si / luego a lo largo de toda su vida. No es una hora para estar seguro.

En segundo lugar, en los lenguajes tipo C, tienes el hábito de simplemente saber que los condicionales son lo primero en la línea. Me di cuenta de esto cuando estaba usando Ruby y encontré líneas como:

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

Si fui un usuario de Ruby desde hace mucho tiempo, probablemente no habría tenido un problema con esta línea, pero viniendo de C, cuando vea “callMethodWhatever” como el primero en la línea, espera que se ejecute. El?: Es menos críptico, pero aún lo suficientemente inusual como para echar a un lector.

La ventaja, sin embargo, es una sensación realmente genial en su barriga cuando puede escribir una statement if de 3 líneas en el espacio de 1 de las líneas. No lo puedo negar 🙂 Pero sinceramente, no es necesariamente más fácil de leer por el 90% de las personas simplemente por su rareza.

Cuando es realmente una tarea basada en un Boolean y valores, no tengo ningún problema con ella, pero se puede abusar fácilmente.