web-dev-qa-db-ger.com

Wie heißt der Operator Java?: Und was macht er?

Ich habe ein paar Jahre mit Java gearbeitet, aber bis vor kurzem bin ich nicht auf dieses Konstrukt gestoßen:

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

Dies ist wahrscheinlich eine sehr einfache Frage, aber kann es jemand erklären? Wie lese ich es? Ich bin mir ziemlich sicher, wie es funktioniert.

  • wenn isHere wahr ist, wird getHereCount() aufgerufen,
  • if isHere is false getAwayCount() wird aufgerufen.

Richtig? Wie heißt dieses Konstrukt?

142
mainstringargs

Ja, es ist eine Kurzform von

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

Es heißt der bedingte Operator . Viele Leute nennen es (fälschlicherweise) den ternären Operator, weil es der einzige ternäre Operator (mit drei Argumenten) in Java, C, C++ und wahrscheinlich vielen anderen Sprachen ist. Aber theoretisch gibt es könnte einen anderen ternären Operator, wohingegen es nur einen bedingten Operator geben kann.

Der offizielle Name ist in der Java Language Specification angegeben:

§15.25 Bedingter Operator? :

Der Bedingungsoperator ? : Verwendet den Booleschen Wert eines Ausdrucks, um zu entscheiden, welcher von zwei anderen Ausdrücken ausgewertet werden soll.

Beachten Sie, dass beide Zweige zu Methoden mit Rückgabewerten führen müssen:

Es ist ein Fehler beim Kompilieren, wenn entweder der zweite oder der dritte Operandenausdruck eine leere Methode aufruft.

Nach der Grammatik der Ausdrucksanweisungen ( §14.8 ) darf ein bedingter Ausdruck in keinem Kontext auftreten, in dem eine leere Methode aufgerufen wird könnte erscheinen.

Wenn also doSomething() und doSomethingElse() ungültige Methoden sind, können Sie dies nicht komprimieren:

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

das mögen:

someBool ? doSomething() : doSomethingElse();

Einfache Worte:

booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse 
178
Michael Myers

Andere haben dies in angemessenem Umfang beantwortet, jedoch häufig mit dem Namen "ternärer Operator".

Da ich der Pedant bin, möchte ich klarstellen, dass der Name des Operators der bedingte Operator oder "bedingter Operator?:" Ist. Es ist ein ternärer Operator (da er drei Operanden hat) und es ist zufällig der einzige ternäre Operator in Java im Moment.

Das spec ist ziemlich klar dass sein Name der bedingte Operator oder "bedingter Operator?:" Ist, um absolut eindeutig zu sein. Ich denke, es ist klarer, es mit diesem Namen zu bezeichnen, da es das Verhalten des Operators in gewissem Maße anzeigt (eine Bedingung auswertend) und nicht nur, wie viele Operanden es hat.

30
Jon Skeet

Entsprechend der Sun Java Specification ) wird sie Bedingter Operator genannt. Siehe Abschnitt 15.25. Sie haben Recht, was sie tut.

Der bedingte Operator? : Verwendet den Booleschen Wert eines Ausdrucks, um zu entscheiden, welcher der beiden anderen Ausdrücke ausgewertet werden soll.

Der bedingte Operator ist syntaktisch rechtsassoziativ (gruppiert von rechts nach links), so dass a? B: c? D: e? F: g dasselbe bedeutet wie a? B: (c? D: (e? F :G)).

ConditionalExpression:
        ConditionalOrExpression
        ConditionalOrExpression ? Expression : ConditionalExpression

Der bedingte Operator hat drei Operandenausdrücke. ? wird zwischen dem ersten und dem zweiten Ausdruck angezeigt, und: wird zwischen dem zweiten und dem dritten Ausdruck angezeigt.

Der erste Ausdruck muss vom Typ Boolean oder Boolean sein. Andernfalls tritt ein Fehler beim Kompilieren auf.

17
JRL

Nicht genau richtig, um genau zu sein:

  1. wenn isHere wahr ist, ist Ergebnis von getHereCount () zurückgegeben
  2. ansonsten ist Ergebnis von getAwayCount () zurückgegeben

Das "zurückgegeben" ist sehr wichtig. Dies bedeutet, dass die Methoden muss einen Wert zurückgeben und dieser Wert muss irgendwo zugewiesen wird.

Außerdem entspricht nicht gena syntaktisch der if-else-Version. Beispielsweise:

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

Wenn mit if-else codiert, wird immer mehr Bytecode erzeugt.

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

meint :

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

Ternär, bedingt; Tomate, Tomate. Was es wirklich wertvoll macht, ist die variable Initialisierung. Wenn Sie (wie ich) Variablen gerne dort initialisieren, wo sie definiert sind, können Sie dies mit dem bedingten ternären Operator (für beides) in Fällen tun, in denen Bedingtheit bezüglich ihres Werts besteht. Besonders bemerkenswert in den letzten Bereichen, aber auch anderswo nützlich.

z.B.:

public class Foo {
    final double    value;

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

Ohne diesen Operator - mit welchem ​​Namen auch immer - müssten Sie das Feld nicht final machen oder eine Funktion schreiben, um es einfach zu initialisieren. Eigentlich ist das nicht richtig - es kann immer noch mit if/else initialisiert werden. zumindest in Java. Aber ich finde das sauberer.

3
Carl Manaster

Dieses Konstrukt heißt Ternärer Operator in Informatik und Programmiertechniken.
Und Wikipedia schlagen folgende Erklärung vor:

In der Informatik ist ein ternärer Operator (manchmal fälschlicherweise als tertiärer Operator bezeichnet) ein Operator, der drei Argumente akzeptiert. Die Argumente und das Ergebnis können unterschiedlichen Typs sein. Viele Programmiersprachen, die eine C-ähnliche Syntax verwenden, verfügen über einen ternären Operator?:, Der einen bedingten Ausdruck definiert.

Diese Syntax ist nicht nur in Java, sondern auch in PHP und Objective-C verfügbar.

Im folgenden link gibt es die folgende Erklärung, die es recht gut zu verstehen ist:

Ein ternärer Operator ist eine Operation, die mit 3 Eingängen arbeitet. Es ist eine Abkürzung für eine if-else-Anweisung und wird auch als bedingter Operator bezeichnet.

In Perl/PHP funktioniert es als:
boolean_condition ? true_value : false_value

In C/C++ funktioniert es wie folgt:
logical expression ? action for true : action for false

Dies kann für einige logische Bedingungen lesbar sein, die nicht zu komplex sind. Andernfalls ist es besser, If-Else-Block mit der beabsichtigten Kombination bedingter Logik zu verwenden.

Wir können die If-Else-Blöcke mit diesem Ternary-Operator für eine Code-Anweisungszeile vereinfachen.
Zum Beispiel:

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

Könnte gleich sein mit:

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

Wenn wir uns also auf Ihre Aussage beziehen:

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

Es ist tatsächlich das 100% -Äquivalent des folgenden If-Else-Blocks :

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

Das ist es!
Hoffe das war hilfreich für jemanden!
Prost!

3
Randika Vishman
condition ? truth : false;

Wenn die Bedingung true ist, geben Sie den ersten Parameter zurück. Wenn die Bedingung false ist, geben Sie den zweiten Parameter zurück.

Es heißt Bedingter Operator und es ist eine Art Ternäre Operation .

3
Joe Phillips

Richtig. Es heißt ternärer Operator . Einige nennen es auch den bedingten Operator .

2
cletus

Sein ternärer 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.
2
Darsy

Eigentlich kann es mehr als 3 Argumente geben. Wenn wir zum Beispiel prüfen möchten, ob eine Zahl positiv, negativ oder null ist, können wir dies tun:

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

das ist besser als if, else if, else.

1
Praised

Sie könnten an einem Vorschlag für einige neue Operatoren interessiert sein, die dem bedingten Operator ähnlich sind. Die nullsicheren Operatoren aktivieren folgenden Code:

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

Es wäre besonders praktisch, wenn das automatische Entpacken stattfindet.

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

Es wurde zur weiteren Berücksichtigung ausgewählt unter JDK 7 "Project Coin".

1
erickson

Ich mag diesen Operator wirklich, aber der Leser sollte berücksichtigt werden.

Sie müssen immer die Kompaktheit des Codes mit der Zeit abwägen, die Sie damit verbringen, ihn zu lesen, und dabei weist er einige ziemlich schwere Mängel auf.

Zuallererst gibt es den Original Asker-Fall. Er verbrachte nur eine Stunde damit, darüber zu posten und die Antworten zu lesen. Wie lange hätte es gedauert, jeden zu schreiben?: Als ein Wenn/Dann im Laufe seines gesamten Lebens. Keine Stunde, um sicher zu sein.

Zweitens haben Sie in C-ähnlichen Sprachen die Gewohnheit, einfach zu wissen, dass Bedingungen das erste sind, was in der Zeile steht. Ich bemerkte dies, als ich Ruby verwendete und auf folgende Zeilen stieß:

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

Wenn ich lange Zeit Ruby Benutzer gewesen wäre, hätte ich wahrscheinlich kein Problem mit dieser Zeile gehabt, aber wenn Sie "callMethodWhatever" als erstes in der Zeile sehen, kommen Sie von C Erwarten Sie, dass es ausgeführt wird. Das?: ist weniger kryptisch, aber dennoch ungewöhnlich genug, um einen Leser auszuschalten.

Der Vorteil ist jedoch ein wirklich cooles Gefühl in Ihrem Bauch, wenn Sie eine 3-zeilige if-Anweisung in den Raum von 1 der Zeilen schreiben können. Kann das nicht leugnen :) Aber ehrlich gesagt, nicht unbedingt lesbarer für 90% der Leute da draußen, einfach wegen seiner Seltenheit.

Wenn es sich wirklich um eine Aufgabe handelt, die auf einem Booleschen Wert und Werten basiert, habe ich kein Problem damit, aber es kann leicht missbraucht werden.

0
Bill K

Bedingte Ausdrücke haben einen völlig anderen Stil und kein explizites if in der Anweisung.

Die Syntax lautet: Boolescher Ausdruck? expression1: expression2;

Das Ergebnis dieses bedingten Ausdrucks ist

expression1 wenn der Boolesche Ausdruck wahr ist;

andernfalls lautet das Ergebnis expression2.

Angenommen, Sie möchten die größere Anzahl der Variablen num1 und num2 auf max. Sie können einfach eine Anweisung mit dem Bedingungsausdruck schreiben: max = (num1> num2)? num1: num2;

Hinweis: Die Symbole? und: erscheinen zusammen in einem bedingten Ausdruck. Sie bilden einen bedingten Operator und werden auch als ternärer Operator bezeichnet, da drei Operanden verwendet werden. Es ist der einzige ternäre Operator in Java.

zitiert von: Intro to Java Programming 10. Auflage von Y. Daniel Liang Seite 126 - 127

0
Ged

Ja du hast Recht. ?: wird typischerweise als "ternärer bedingter Operator" bezeichnet, der oft einfach als "ternärer Operator" bezeichnet wird. Es ist eine Kurzfassung des Standards if/else conditional.

Ternärer Bedingungsoperator

0
Gary

Es ist der bedingte Operator und mehr als nur eine kurze Schreibweise für if-Anweisungen.

Da es sich um einen Ausdruck handelt, der einen Wert zurückgibt, kann er als Teil anderer Ausdrücke verwendet werden.

0
justinhj