Pregunta

He estado trabajando con Java un par de años, pero hasta hace poco no he encontrado con esta construcción:

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 cierto, se llama getHereCount(),
  • Si es falso isHere getAwayCount() se llama.

correcta? ¿Cómo se llama esta construcción?

¿Fue útil?

Solución

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) llaman el operador ternario , porque es la única (de tres argumentos) operador ternario en Java, C, C ++, y probablemente muchos otros idiomas. Pero en teoría no podría haber otro operador ternario, mientras que no sólo puede haber un operador condicional .

El nombre oficial es dada en el Java Language Specification :

  

§15.25 Operador condicional? :

     

El ? : operador condicional utiliza el valor booleano de una expresión para decidir cuál de otras dos expresiones debe ser evaluado.

Tenga en cuenta que las dos ramas deben conducir a métodos con los valores de retorno:

  

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

     

De hecho, por la gramática de los estados de expresión ( §14.8 ), no está permitido para una expresión condicional a aparecer en cualquier contexto en el que podría aparecer una invocación de un método vacío.

Por lo tanto, si doSomething() y doSomethingElse() son métodos vacíos, no se puede comprimir la siguiente:

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

en esto:

someBool ? doSomething() : doSomethingElse();

Las palabras simples:

booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse 

Otros consejos

Otros han respondido a esto a medida que sea razonable, pero a menudo con el nombre de "operador ternario".

Al ser el pedante que soy, me gustaría dejar claro que el nombre del operador es el operador condicional o "operador condicional:?". Es a operador ternario (ya que tiene tres operandos) y pasa a ser el único operador ternario en Java en el momento.

Sin embargo, la especificación rel="noreferrer"> href="http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.25" claro que su nombre es el operador condicional o "operador condicional:" para evitar cualquier ambigüedad. Creo que es más clara que llamar por ese nombre, ya que indica el comportamiento del operador, en cierta medida (la evaluación de una condición) en lugar de sólo cuántos operandos que tiene.

De acuerdo con la Sun Java Specification , se llama el operador condicional. Véase la sección 15.25. Tienes razón en cuanto a lo que hace.

El operador condicional? :. Usa el valor booleano de una expresión para decidir cuál de otras dos expresiones debe ser evaluado

El operador condicional es sintácticamente asociativo por la derecha (grupos de TI de derecha a izquierda), de modo que un b:? C d:? E f:? G significa lo mismo que un b:?? (C d :( ? e f:. g))

ConditionalExpression:
        ConditionalOrExpression
        ConditionalOrExpression ? Expression : ConditionalExpression

El operador condicional tiene tres expresiones de operando; ? aparece entre la primera y segunda expresiones, y:. aparece entre la segunda y tercera expresiones

La primera expresión debe ser de boolean tipo o booleana, o un tiempo de compilación se produce error.

No es exactamente correcto, para ser más precisos:

  1. si isHere es cierto, el resultado de getHereCount () es devuelto
  2. otheriwse la resultado de getAwayCount () es devuelto

Eso "devolvió" es muy importante. Esto significa que los métodos debe devolver un valor y ese valor debe asignar alguna parte.

Además, es no 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 estará con if-else siempre se traducirá en más de código de bytes.

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

significa:

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

Si se true la condición luego regresar al primer parámetro. Si la condición es false, devuelva el segundo parámetro.

Se llama la operador condicional y es un tipo de ternario Operación .

ternario, condicional; tomate, tomatoh. Lo que es realmente valioso para la inicialización es variable. Si (como yo) que es aficionado a la inicialización de las variables en el que se definen, el operador ternario condicional (ya que es tanto) que permite hacer que en los casos donde hay condicionalidad acerca de su valor. Particularmente notable en los campos finales, pero útil en otros lugares, también.

por ejemplo:.

public class Foo {
    final double    value;

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

Sin ese operador - por cualquier nombre - que tendría que hacer que el campo no final o escribir una función simplemente para inicializarlo En realidad, eso no es correcto -. Todavía se puede inicializar utilizando si / más, al menos en Java. Pero encuentro este limpiador.

Esta construcción se llama ternario Operador en Informática y técnicas de programación. Opiniones y Wikipedia sugiere la siguiente explicación:

  

En informática, un operador ternario (a veces incorrectamente llamada a un operador terciario) es un operador que toma tres argumentos. Los argumentos y el resultado pueden ser de diferentes tipos. Muchos lenguajes de programación que utilizan la sintaxis similar a C cuentan con un operador ternario,:?., Que define una expresión condicional

No sólo en Java, esta sintaxis está disponible dentro de PHP, Objective-C también.

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

  

A operador ternario es alguna operación que operan en 3 entradas. Es un acceso directo para una sentencia 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 utilizar Si-Else bloque con combinación prevista de la lógica condicional.

Podemos simplificar el Si-Else bloques con este operador ternario de un código de línea del estado
Por ejemplo:.

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

Podría ser iguales a los siguientes:

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

Así que si nos referimos a su estado de cuenta:

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

En realidad, es el 100% en equivalentes de los siguientes Si-Else bloque :

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

Eso es todo!
Espero que esto era útil a alguien!
Saludos!

correcta. Es llamada ternaria operador . Algunos también lo llaman el operador condicional .

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.

Usted podría estar interesado en una propuesta para algunos nuevos operadores que son similares al operador condicional. Los operadores nulos de fallos permitirán código como el siguiente:

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

Sería especialmente conveniente donde auto-unboxing tiene lugar.

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

Ha sido seleccionada para un nuevo examen debajo de JDK 7 "Coin Proyecto".

En realidad, puede tomar más de 3 argumentos. Por ejemplo, si queremos comprobado 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 sentencias if.

Dado que es una expresión que devuelve un valor que puede ser utilizado como parte de otras expresiones.

Sí, tiene usted razón. ?: Se suele llamar el "operador condicional ternario", a menudo se denomina simplemente "operador ternario". Es una versión abreviada de la norma if / else condicional.

operador condicional ternario

Sucede que me gusta mucho este operador, pero el lector debe ser tomado en cuenta.

Siempre se tiene que equilibrar compacidad código con el tiempo dedicado a la lectura, y en que tiene algunos defectos bastante graves.

En primer lugar, está el caso del autor de la pregunta original. Él acaba de pasar una hora publicar al respecto y la lectura de las respuestas. Como ya habría que han tomado el autor para escribir todos:? Como si / entonces a lo largo de toda su vida. Ni una hora para estar seguro.

En segundo lugar, en los lenguajes como C, que se obtiene en el hábito de simple hecho de saber que los condicionales son la primera cosa en la línea. Me di cuenta de esto cuando estaba usando Ruby y me encontré con líneas como:

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

Si fuera un usuario de Ruby mucho tiempo, probablemente no habría tenido un problema con esta línea, pero viniendo de C, cuando vea "callMethodWhatever" como la primera cosa en la línea, se espera que sea ejecutada. El:?. Críptica es menor, pero aún lo suficientemente inusual como para lanzar un lector fuera

La ventaja, sin embargo, es una sensación muy fría en su estómago cuando se puede escribir una línea 3 si la declaración en el espacio de 1 de las líneas. No se puede negar que :) Pero, honestamente, no necesariamente más fácil de leer en un 90% de la gente por ahí simplemente a causa de su rareza.

Cuando es verdaderamente una asignación basada en un valor booleano y los valores que no tengo un problema con él, pero que puede ser fácilmente abusado.

Las expresiones condicionales están en un estilo completamente diferente, sin la explícita si en la declaración.

La sintaxis es: boolean-expresión? expression1: expression2;

El resultado de esta expresión condicional es

expression1 si boolean-expresión es verdadera;

lo contrario el resultado es EXPRESIÓN2.

Supongamos que desea asignar el mayor número de num1 variable y num2 al máximo. Simplemente puede escribir una declaración mediante la expresión condicional: max = (num1> num2)? num1: num2;

Nota: Los símbolos? y: aparecen juntos en una expresión condicional. Forman un operador condicional y también llamado un operador ternario, ya que utiliza tres operandos. Es el único operador ternario en Java.

citado de: Introducción a Java edición de programación 10a a página Y. Daniel Liang 126-127

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top