Java 13 führte die yield
Stichwort für switch
Ausdrücke.
Wie kann ich es verwenden und was ist der Unterschied zu einem Standard return
oder break
Wert?
Nullzwl
Java 13 führte die yield
Stichwort für switch
Ausdrücke.
Wie kann ich es verwenden und was ist der Unterschied zu einem Standard return
oder break
Wert?
Andreas Tobilko
Wie kann ich es verwenden?
Mit Pfeilbeschriftungen, wenn ein ganzer Block benötigt wird:
int value = switch (greeting) {
case "hi" -> {
System.out.println("I am not just yielding!");
yield 1;
}
case "hello" -> {
System.out.println("Me too.");
yield 2;
}
default -> {
System.out.println("OK");
yield -1;
}
};
Mit traditionellen Blöcken:
int value = switch (greeting) {
case "hi":
System.out.println("I am not just yielding!");
yield 1;
case "hello":
System.out.println("Me too.");
yield 2;
default:
System.out.println("OK");
yield -1;
};
Was ist der Unterschied zu einer Standardrückgabe?
EIN return
-Anweisung gibt die Kontrolle an zurück der Aufrufer einer Methode (§8.4, §15.12) oder Konstrukteur (§8.8, §15.9) während ein yield
Anweisung überträgt die Kontrolle durch eine Einschließung verursachen switch
Ausdruck um einen bestimmten Wert zu erzeugen.
Was ist der Unterschied zu einem Bruchwert?
Das break
mit Wertangabe entfällt zugunsten von a yield
Aussage.
Es gibt Spezifikation für JEP 354 angehängt die JLS 13 die alles zusammenfasst, was wir über das Neue wissen müssen switch
. Beachten Sie, dass es nicht in die Sprachspezifikation aufgenommen wurde, da es immer noch vorhanden ist eine Vorschaufunktion und damit noch kein fester Bestandteil der Sprache.
EIN
yield
Die Anweisung überträgt die Kontrolle, indem sie eine Einschließung verursachtswitch
Ausdruck, um einen bestimmten Wert zu erzeugen.YieldStatement: yield Expression;
EIN
yield
Die Anweisung versucht, die Kontrolle an den innersten einschließenden Schalterausdruck zu übertragen. dieser Ausdruck, der aufgerufen wird das Ertragszielwird dann sofort normal abgeschlossen und der Wert derExpression
wird der Wert derswitch
Ausdruck.
Es ist ein Kompilierungsfehler, wenn a
yield
Aussage hat kein Ertragsziel.Es ist ein Kompilierungsfehler, wenn die
yield
target enthält alle Methoden, Konstruktoren, Initialisierer oder Lambda-Ausdrücke, die die yield-Anweisung einschließen.Es ist ein Kompilierungsfehler, wenn die
Expression
von ayield
Aussage ist ungültig (15.1).Ausführung einer
yield
Anweisung wertet zuerst die ausExpression
. Wenn die Auswertung derExpression
schließt abrupt aus irgendeinem Grund, dann dieyield
Anweisung wird aus diesem Grund abrupt abgeschlossen. Bei Auswertung derExpression
wird normal abgeschlossen und erzeugt einen WertV
dann ist dieyield
Aussage abrupt abgeschlossen, der Grund ist eine Rendite mit WertV
.
Benutzer7294900
Als Teil von JEP 354 (Java 13) ist dies möglich Ertrag Wert im Schalter (wahlweise Variable zuweisen)
yield-Anweisung, um einen Wert zu liefern, der zum Wert des einschließenden Schalterausdrucks wird.
int j = switch (day) { case MONDAY -> 0; case TUESDAY -> 1; default -> { int k = day.toString().length(); int result = f(k); yield result; } };
Ich denke, Ihre Verwirrung ist mit JEP 325 auf Java 12, die break verwenden, um den Wert zurückzugeben:
wir haben die break-Anweisung erweitert, um ein Argument anzunehmen, das zum Wert des einschließenden switch-Ausdrucks wird.
int j = switch (day) { case MONDAY -> 0; case TUESDAY -> 1; default -> { int k = day.toString().length(); int result = f(k); break result;
Darüber hinaus können Sie sogar verwenden Lambda-Syntax
boolean result = switch (ternaryBool) { case TRUE -> true; case FALSE -> false; case FILE_NOT_FOUND -> throw new UncheckedIOException( "This is ridiculous!", new FileNotFoundException()); // as we'll see in "Exhaustiveness", `default` is not necessary default -> throw new IllegalArgumentException("Seriously?! 🤬"); };
Mit Switch-Ausdrücken „bekommt“ der gesamte Switch-Block „einen Wert“, der dann zugewiesen werden kann; Sie können eine Syntax im Lambda-Stil verwenden
Während Java 12 Switch-Ausdrücke einführt und 13 verfeinert, tun sie dies als Vorschau-Sprachfunktion. Das bedeutet, dass (a) es sich immer noch über die nächsten Releases ändern kann (wie es zwischen 12 und 13 der Fall war) und (b) es zur Kompilierungs- und Laufzeit mit der neuen Befehlszeilenoption –enable- entsperrt werden muss. Vorschau. Dann Denken Sie daran, dass dies nicht das Endspiel für Switch ist – es ist nur ein Schritt auf dem Weg zum vollständigen Musterabgleich.
Weiß jemand, warum dies von JDK 12 geändert wurde? Das JEP gibt nicht viel Aufschluss darüber, warum yield
gewählt wurde break
.
– Druckles
22. September 2019 um 12:56 Uhr
@Druckles es scheint eine Entscheidung zu sein, sich zu trennen Unterbrechung für Trennschalter u Ertrag für den Rückgabewert siehe metebalci.com/blog/was-ist-neu-in-java-13/… Auch mit break kann man zum Label see wechseln docs.oracle.com/javase/specs/jls/se13/preview/…
– Benutzer7294900
22. September 2019 um 13:06 Uhr
@Druckles Es wurde geändert, weil bei unserer Recherche mit Benutzern die Überladung von gefunden wurde break
verwirrend.
– Brian Götz
22. September 2019 um 16:49 Uhr
@BrianGoetz es ist verwirrend. Allerdings gefiel mir die Analogie mit den beiden Formen von return
genannt hier
– Andreas Tobilko
22. September 2019 um 21:11 Uhr
[email protected] in Kotlin ist eine viel bessere Lösung als ein neues Schlüsselwort …
– Andreas Schneck
9. Mai 2021 um 7:43 Uhr
Vikas
yield
markiert den Wert, der von einem Switch-Zweig zurückgegeben werden soll. Es beendet den switch-Ausdruck, Sie müssen danach kein break haben.
Aus Dok
Die beiden Anweisungen break (mit oder ohne Label) und yield erleichtern die einfache Unterscheidung zwischen switch-Anweisungen und switch-Ausdrücken: eine switch-Anweisung, aber kein switch-Ausdruck, kann das Ziel einer break-Anweisung sein; und ein switch-Ausdruck, aber keine switch-Anweisung, kann das Ziel einer yield-Anweisung sein.
Es bietet auch, NullPointerException
Sicherheit,
String message = switch (errorCode) {
case 404:
yield "Not found!";
case 500:
yield "Internal server error!";
// No default
};
Dies wird dazu führen,
Der Switch-Ausdruck deckt nicht alle möglichen Eingabewerte ab
knifflig
Break Ersetzen durch Yield in Java 13. Dies ist eine der in Java 13 definierten Vorschaufunktionen. In Java 12 können wir Break verwenden, um einen Wert von einem Schalter zurückzugeben. Aber in Java 13 wird der Rückgabewert des Schalterausdrucks verwendet.
In Java 13 wird break durch yield ersetzt,
String number = switch (number) {
case 1:
yield "one";
case 2:
yield "two";
default:
yield "Zero";
}
Die Pfeilsyntax wird in Java 13 weiterhin unterstützt.
String number = switch (number) {
case 1 -> "one";
case 2 -> "two";
default -> "Zero";
}
Es wird immer nur verwendet, um einen Rückgabewert innerhalb von a anzugeben
switch
Aussage. Es ist anders als bei areturn
als es Erträge von einer Aussage im Gegensatz zu kehrt zurück aus einer Methode.– Boris die Spinne
22. September 2019 um 12:25 Uhr
@BoristheSpider Java 12 verwendet
break <value>
dasreturn <value>
wurde iirc nur berücksichtigt, aber nie Teil einer veröffentlichten Version.– Mark Rotteveel
22. September 2019 um 12:28 Uhr
Es ist erwähnenswert, dass
yield
ist kein Stichwort.Thread
hat einyield()
Methode, die dort bleibt, und Sie können alle Ihre Variablen, Felder, Methoden oder Labels benennenyield
solange Ihr Namensraum es zulässt.– Ahmad Shahwan
18. Oktober um 19:36 Uhr