Domanda

Lavoro con Java da un paio d'anni, ma fino a poco tempo fa non mi sono imbattuto in questo costrutto:

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

Probabilmente è una domanda molto semplice, ma qualcuno può spiegarmelo?Come lo leggo?Sono abbastanza sicuro di sapere come funziona.

  • Se isHere è vero, getHereCount() è chiamato,
  • Se isHere è falso getAwayCount() è chiamato.

Corretto?Come si chiama questo costrutto?

È stato utile?

Soluzione

Sì, è una forma abbreviata di

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

Si chiama operatore condizionale . Molte persone (erroneamente) chiamano l'operatore ternario , perché è l'unico (tre argomenti) operatore ternario in Java, C, C ++, e probabilmente molte altre lingue. Ma in teoria non ci potrebbero sarà un altro operatore ternario, considerando che non può essere solo un operatore condizionale .

Il nome ufficiale è dato nel Java Language Specification :

  

§15.25 condizionale operatore? :

     

L'operatore ? : condizionale utilizza il valore booleano di un'espressione per decidere quale delle altre due espressioni deve essere valutato.

Si noti che entrambi i rami devono condurre a metodi con i valori di ritorno:

  

Si tratta di un errore di compilazione per il secondo o il terzo espressione operando come un'invocazione di un metodo vuoto.

     

In effetti, dalla grammatica di dichiarazioni di espressione ( §14.8 ), non è consentito per un'espressione condizionale per apparire in qualsiasi contesto in cui potrebbe apparire un'invocazione di un metodo vuoto.

Quindi, se doSomething() e doSomethingElse() sono metodi vuoti, non è possibile comprimere questo:

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

in questo modo:

someBool ? doSomething() : doSomethingElse();

Parole semplici:

booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse 

Altri suggerimenti

Altri hanno risposto presente in misura ragionevole, ma spesso con il nome di "operatore ternario".

Essendo il pedante che io sono, mi piacerebbe mettere in chiaro che il nome del gestore è l'operatore condizionale o "operatore condizionale:?". È un operatore ternario (fatto di presentare tre operandi) e sembra essere l'unico operatore ternario in Java al momento.

Tuttavia, il spec è abbastanza chiaro che il suo nome è l'operatore condizionale o "operatore condizionale:?" essere assolutamente univoca. Credo sia chiaro chiamare con quel nome, come indica il comportamento dell'operatore in una certa misura (valutazione di una condizione) piuttosto che quanti operandi ha.

Secondo il Sun Java Specification , si chiama l'operatore condizionale. Vedere la sezione 15.25. Hai ragione per ciò che fa.

L'operatore condizionale? :. Utilizza il valore booleano di un'espressione per decidere quale delle altre due espressioni deve essere valutato

L'operatore condizionale è sintatticamente destra-associativo (gruppi IT destra a sinistra), in modo che una b: c d: e f:? G, la definizione di un b:? (C d :( ? e f:. g))

ConditionalExpression:
        ConditionalOrExpression
        ConditionalOrExpression ? Expression : ConditionalExpression

L'operatore condizionale ha tre espressioni operando; ? appare tra il primo e secondo espressioni, e:. compare tra il secondo e il terzo espressioni

La prima espressione deve essere di tipo booleano o booleano, o in fase di compilazione si verifica un errore.

Non esattamente corretta, per la precisione:

  1. se ishere è vero, la risultato di getHereCount () è tornato
  2. otheriwse il risultato di getAwayCount () è tornato

Questo "tornato" è molto importante. Significa che i metodi di deve restituire un valore e che il valore deve da assegnare qualche parte.

Inoltre, è non è esattamente sintatticamente equivalente alla versione if-else. Ad esempio:

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

Se codificate con if-else sarà sempre tradurrà in più bytecode.

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

significa:

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

Se la condizione è true quindi restituire il primo parametro. Se la condizione è false, restituire il secondo parametro.

Si chiama condizionale Operatore e si tratta di un tipo di Operazione Ternario .

ternaria, condizionale; pomodoro, tomatoh. Ciò che è veramente importante per l'inizializzazione è variabile. Se (come me) che sei appassionato di inizializzazione delle variabili in cui sono definiti, l'operatore ternario condizionale (per questo è allo stesso tempo) permette di farlo nei casi in cui v'è la condizionalità sul suo valore. Particolarmente notevole nei campi finali, ma utile anche altrove.

per esempio:.

public class Foo {
    final double    value;

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

Senza tale operatore - qualunque sia il nome - che avrebbe dovuto rendere il campo non-finale o scrivere una funzione semplicemente per inizializzare In realtà, questo non è giusto -. Può ancora essere inizializzato con se / altro, almeno in Java. Ma trovo questo pulitore.

Questo costrutto è chiamato ternario Operatore in Computer Science e tecniche di programmazione. Comprare e Wikipedia suggeriscono la seguente spiegazione:

  

In informatica, un operatore ternario (a volte erroneamente chiamato un operatore di terziario) è un operatore che prende tre argomenti. Gli argomenti e il risultato può essere di diversi tipi. Molti linguaggi di programmazione che utilizzano la sintassi C-like dispongono di un operatore ternario,:?., Che definisce un'espressione condizionale

Non solo in Java, questa sintassi è disponibile all'interno di PHP, Objective-C troppo.

Nel seguente dà la seguente spiegazione, che è buono tranquilla per capirlo:

  

Un operatore ternario è qualche operazione operare su 3 ingressi. E 'una scorciatoia per un'istruzione if-else, ed è anche conosciuto come un operatore condizionale.

     

In Perl / PHP funziona come:
boolean_condition ? true_value : false_value

     

In C / C ++ funziona come:
logical expression ? action for true : action for false

Questo potrebbe essere leggibile per alcune condizioni logiche che non sono troppo complesse altrimenti è meglio utilizzare if-else blocco con la combinazione prevista di logica condizionale.

Possiamo semplificare la if-else blocchi con questo operatore ternario per un codice di linea dichiarazione
Ad esempio:.

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

Potrebbe essere pari ai seguenti:

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

Quindi, se ci riferiamo alla sua dichiarazione:

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

In realtà è l'equivalente del 100% delle seguenti if-else blocco :

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

Questo è tutto!
Spero che questo è stato utile a qualcuno!
Cheers!

Una corretta. E ' denominato ternario operatore . Alcuni lo chiamano anche il condizionale operatore .

Il suo operatore 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.

Potreste essere interessati ad un proposta per alcuni nuovi operatori che sono simili a l'operatore condizionale. Gli operatori nulli di sicurezza consentiranno codice come questo:

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

Sarebbe particolarmente conveniente in cui l'auto-unboxing avviene.

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

E 'stato selezionato per un ulteriore esame sotto JDK 7 del "Progetto della moneta."

In realtà si può prendere più di 3 argomenti. Per esempio, se vogliamo controllare wether un numero è positivo, negativo o pari a zero si può fare questo:

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

, che è meglio che usare if, else if, else.

E 'l'operatore condizionale, ed è più di un semplice modo conciso di scrivere istruzioni if.

Poiché si tratta di un'espressione che restituisce un valore che può essere utilizzato come parte di altre espressioni.

Sì, lei ha ragione. ?: In genere è chiamato "operatore condizionale ternario", spesso definita semplicemente come "operatore ternario". Si tratta di una versione abbreviata dello standard if / else condizionale.

ternario condizionale Operatore

mi capita di piace molto questo operatore, ma il lettore dovrebbe essere preso in considerazione.

Devi sempre bilanciare la compattezza codice con il tempo dedicato alla lettura, e in quanto ha alcuni piuttosto gravi difetti.

Prima di tutto, c'è il caso originale del richiedente. Ha appena trascorso un'ora distacco su di esso e la lettura delle risposte. Come più ci sarebbe voluto l'autore a scrivere ogni:? Come if / then durante tutto il corso della sua intera vita. Non un'ora per essere sicuri.

In secondo luogo, in C-come le lingue, si ottiene l'abitudine di semplicemente sapendo che i condizionali sono la prima cosa nella linea. Ho notato questo quando ero con Ruby e sono imbattuto in linee come:

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

Se fossi un utente molto tempo di Ruby probabilmente non avrei avuto un problema con questa linea, ma provenienti da C, quando si vede "callMethodWhatever" come prima cosa in linea, ci si aspetta di essere giustiziato. L':?. È meno criptico, ma ancora abbastanza insolito come gettare un lettore di fuori

Il vantaggio, però, è una sensazione davvero cool nella tua pancia quando si può scrivere un 3-line if nello spazio di 1 delle linee. Non può negare che :) Ma onestamente, non necessariamente più leggibile per il 90% delle persone là fuori semplicemente a causa della sua rarità.

Quando si è veramente un incarico sulla base di un valore booleano e valori non ho un problema con esso, ma può essere abusato con facilità.

Le espressioni condizionali hanno uno stile completamente diverso, senza un se esplicito nell'istruzione.

La sintassi è:espressione booleana?espressione1:espressione2;

Il risultato di questa espressione condizionale è

espressione1 se espressione-booleana è vera;

altrimenti il ​​risultato è espressione2.

Supponiamo di voler assegnare il numero maggiore di variabili num1 e num2 a max.Puoi semplicemente scrivere un'istruzione utilizzando l'espressione condizionale:massimo = (num1 > num2) ?numero1:numero2;

Nota:I simboli?E :compaiono insieme in un'espressione condizionale.Formano un operatore condizionale e chiamato anche operatore ternario perché utilizza tre operandi.È l'unico operatore ternario in Java.

citato da:Introduzione alla programmazione Java 10a edizione di Y.Daniel Liang pagine 126 - 127

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top