Hoe heet de Java ?:-operator en wat doet deze?

Ik werk al een paar jaar met Java, maar tot voor kort ben ik deze constructie nog niet tegengekomen:

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

Dit is waarschijnlijk een heel simpele vraag, maar kan iemand het uitleggen? Hoe lees ik het? Ik ben er vrij zeker van dat ik weet hoe het werkt.

  • als isHerewaar is, wordt getHereCount()aangeroepen,
  • als isHerefalse is, wordt getAwayCount()aangeroepen.

Juist? Hoe heet deze constructie?


Antwoord 1, autoriteit 100%

Ja, het is een verkorte vorm van

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

Het wordt de voorwaardelijke operatorgenoemd. Veel mensen noemen het (ten onrechte) de ternaire operator, omdat het de enige ternaire (drie-argumenten) operator is in Java, C, C++ en waarschijnlijk vele andere talen. Maar theoretisch kan er zounog een ternaire operator zijn, terwijl er maar één voorwaardelijke operatorkan zijn.

De officiële naam wordt gegeven in de Java-taalspecificatie:

§15.25 Voorwaardelijke operator ? :

De voorwaardelijke operator ? :gebruikt de booleaanse waarde van één uitdrukking om te beslissen welke van de twee andere uitdrukkingen moet worden geëvalueerd.

Merk op dat beide vertakkingen moeten leiden tot methoden met retourwaarden:

Het is een compile-time-fout voor de tweede of de derde operand-expressie om een aanroep van een void-methode te zijn.

In feite, door de grammatica van uitdrukkingsverklaringen (§14.8), is het niet toegestaan dat een voorwaardelijke expressie wordt weergegeven in een context waarin een aanroep van een ongeldige methode zou kunnen verschijnen.

Dus, als doSomething()en doSomethingElse()ongeldige methoden zijn, kunt u dit niet comprimeren:

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

hierin:

someBool ? doSomething() : doSomethingElse();

Eenvoudige woorden:

booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse 

Antwoord 2, autoriteit 16%

Anderen hebben dit in redelijke mate beantwoord, maar vaak met de naam “ternaire operator”.

Als pedant die ik ben, wil ik graag duidelijk maken dat de naam van de operator de voorwaardelijke operator of “voorwaardelijke operator ?:” is. Het is een eenternaire operator (in die zin dat het drie operanden heeft) en het is op dit moment de enige ternaire operator in Java.

De specificatie is echter mooi duidelijkdat zijn naam de voorwaardelijke operator of “voorwaardelijke operator ?:” is om absoluut ondubbelzinnig te zijn. Ik denk dat het duidelijker is om het bij die naam te noemen, omdat het tot op zekere hoogte het gedrag van de operator aangeeft (een voorwaarde evalueren) in plaats van hoeveel operanden het heeft.


Antwoord 3, autoriteit 8%

Volgens de Sun Java-specificatie, het wordt de voorwaardelijke operator genoemd. Zie paragraaf 15.25. Je hebt gelijk wat het doet.

De voorwaardelijke operator ? : gebruikt de booleaanse waarde van één uitdrukking om te beslissen welke van de twee andere uitdrukkingen moet worden geëvalueerd.

De voorwaardelijke operator is syntactisch rechts-associatief (hij groepeert van rechts naar links), zodat a?b:c?d:e?f:g hetzelfde betekent als a?b:(c?d:( e?f:g)).

ConditionalExpression:
        ConditionalOrExpression
        ConditionalOrExpression ? Expression : ConditionalExpression

De voorwaardelijke operator heeft drie operand-expressies; ? verschijnt tussen de eerste en tweede uitdrukking, en : verschijnt tussen de tweede en derde uitdrukking.

De eerste expressie moet van het type boolean of Boolean zijn, anders treedt er een compileerfout op.


Antwoord 4, autoriteit 2%

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

betekent:

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

Antwoord 5, autoriteit 2%

Niet helemaal correct, om precies te zijn:

  1. als isHere waar is, wordt het resultaatvan getHereCount() geretourneerd
  2. anders wordt het resultaatvan getAwayCount() geretourneerd

Dat ‘geretourneerde’ is erg belangrijk. Het betekent dat de methoden moeteneen waarde retourneren en die waarde moetergens worden toegewezen.

Bovendien is het niet preciessyntactisch equivalent aan de if-else-versie. Bijvoorbeeld:

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

Indien gecodeerd met if-else zal altijd resulteren in meer bytecode.


Antwoord 6, autoriteit 2%

Ternair, voorwaardelijk; tomaat, tomaat. Waar het echt waardevol voor is, is variabele initialisatie. Als je (zoals ik) dol bent op het initialiseren van variabelen waar ze zijn gedefinieerd, staat de voorwaardelijke ternaire operator (want het is beide) je toe om dat te doen in gevallen waar er conditionaliteit is over de waarde ervan. Vooral opmerkelijk in laatste velden, maar ook nuttig elders.

bijv.:

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

Zonder die operator – met welke naam dan ook – zou je het veld niet-definitief moeten maken of een functie moeten schrijven om het te initialiseren.Eigenlijk klopt dat niet – het kan nog steeds worden geïnitialiseerd met if /else, althans in Java. Maar ik vind dit schoner.


Antwoord 7, autoriteit 2%

condition ? truth : false;

Als de voorwaarde trueis, evalueer dan de eerste uitdrukking. Als de voorwaarde falseis, evalueer dan de tweede uitdrukking.

Het wordt de Voorwaardelijke operatorgenoemd en het is een type Ternaire operatie.


Antwoord 8

Deze constructie wordt Ternary Operatorgenoemd in computerwetenschappen en programmeertechnieken.
En Wikipediastelt de volgende uitleg voor:

In de informatica is een ternaire operator (soms ten onrechte een tertiaire operator genoemd) een operator waarvoor drie argumenten nodig zijn. De argumenten en het resultaat kunnen van verschillende typen zijn. Veel programmeertalen die C-achtige syntaxis gebruiken, hebben een ternaire operator, ?: , die een voorwaardelijke expressie definieert.

Niet alleen in Java, deze syntaxis is ook beschikbaar in PHP, Objective-C.

In de volgende linkwordt de volgende uitleg gegeven, die stil is goed om het te begrijpen:

Een ternaire operator is een bewerking die op 3 ingangen werkt. Het is een snelkoppeling voor een if-else-statement en wordt ook wel een voorwaardelijke operator genoemd.

In Perl/PHP werkt het als:
boolean_condition ? true_value : false_value

In C/C++ werkt het als:
logical expression ? action for true : action for false

Dit kan leesbaar zijn voor enkele logische omstandigheden die niet te complex zijn, anders is het beter om if-else blok met beoogde combinatie van voorwaardelijke logica te gebruiken.

We kunnen het if-else blokken vereenvoudigen met deze ternaire operator voor één code-instructieslijn.
Bijvoorbeeld:

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

kan gelijk zijn aan het volgende:

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

Dus als we verwijzen naar uw verklaring:

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

Het is eigenlijk het 100% equivalent van het volgende IF-anders-blok :

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

Dat is het!
Ik hoop dat dit nuttig was voor iemand!
Proost!


Antwoord 9

correct. Het is genaamd de ternaire operator . Sommigen noemen het ook de conditional operator .


Antwoord 10

U bent mogelijk geïnteresseerd in een voorstel voor sommige nieuwe operators die vergelijkbaar zijn met de voorwaardelijke operator. De null-safe-operators zullen code als volgt inschakelen:

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

Het zou bijzonder handig zijn waar auto-unboxing plaatsvindt.

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

Het is geselecteerd voor verdere overweging onder JDK 7’s “Project Moin”.


Antwoord 11

de ternaire operator (? 🙂

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.

Antwoord 12

Eigenlijk kan het meer dan 3 argumenten duren. Als we bijvoorbeeld willen controleren of een nummer positief, negatief of nul is, kunnen we dit doen:

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

die beter is dan het gebruik van indien, anders als, anders.


Antwoord 13

Het is de voorwaardelijke operator en het is meer dan alleen een beknopte manier van schrijven als uitspraken.

Aangezien het een uitdrukking is die een waarde retourneert, kan deze worden gebruikt als onderdeel van andere uitdrukkingen.


Antwoord 14

Ja, u bent correct. ?: wordt meestal de “ternaire voorwaardelijke operator” genoemd, vaak aangeduid als eenvoudigweg “Ternaire operator”. Het is een steno-versie van de standaard als / anders voorwaardelijk.

ternaire voorwaardelijke operator


Antwoord 15

Ik vind deze operator echt leuk, maar de lezer moet in overweging worden genomen.

U moet altijd CODE-compactheid in evenwicht brengen met de tijd besteed aan het lezen ervan, en daarin heeft het een aantal behoorlijke ernstige gebreken.

Allereerst is er de zaak van de originele Asseur. Hij bracht zojuist een uur door en leest de reacties. Hoe langer zou het de auteur hebben genomen om alles te schrijven?: Als een if / dan in de loop van zijn hele leven. Geen uur om zeker te zijn.

Ten tweede, in C-achtige talen, krijg je de gewoonte om eenvoudigweg te weten dat voorwaardelijkheid het eerste in de lijn is. Ik heb dit opgemerkt toen ik Ruby gebruikte en de lijnen kreeg zoals:

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

Als ik een lange tijd Ruby-gebruiker was, zou ik waarschijnlijk geen probleem hebben gehad met deze lijn, maar afkomstig van C, wanneer je “callsmethodwhodwhatever” ziet als het eerste in de lijn, verwacht je dat het wordt uitgevoerd. The?: Is minder cryptisch, maar nog steeds ongebruikelijk genoeg om een ​​lezer af te werpen.

Het voordeel is echter een heel cool gevoel in uw buik wanneer u een 3-regel indien een verklaring in de ruimte van 1 van de lijnen kunt schrijven. Kan dat niet ontkennen 🙂 Maar eerlijk gezegd, niet noodzakelijkerwijs leesbaarder met 90% van de mensen, gewoon vanwege zijn ‘zeldzaamheid.

Wanneer het echt een opdracht is op basis van een boolean en waarden, heb ik er geen probleem mee, maar het kan gemakkelijk worden misbruikt.


Antwoord 16

Voorwaardelijke uitdrukkingen zijn in een volledig andere stijl, zonder expliciet als in de verklaring.

De syntaxis is:
Boolean-expressie? expressie1: expression2;

Het resultaat van deze voorwaardelijke uitdrukking is

Expression1 Als Boolean-expressie waar is;

anders is het resultaat expression2.

Stel dat u het grotere aantal variabelen num1 en num2 wilt toewijzen aan max. U kunt eenvoudig een verklaring schrijven met behulp van de voorwaardelijke expressie:
max = (num1 > num2) ? num1 : num2;

Opmerking: De symbolen ? en : verschijnen samen in een voorwaardelijke expressie. Ze vormen een voorwaardelijke operator en worden ook wel een ternaire operator genoemd omdat deze drie operanden gebruikt. Het is de enige ternaire operator in Java.

geciteerd uit: Intro to Java Programming 10e editie door Y. Daniel Liang pagina 126 – 127

Other episodes