Was bedeutet das neue Schlüsselwort „yield“ in Java 13?

Lesezeit: 6 Minuten

Benutzeravatar von zerocewl
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?

  • Es wird immer nur verwendet, um einen Rückgabewert innerhalb von a anzugeben switch Aussage. Es ist anders als bei a return 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>das return <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 ein yield() Methode, die dort bleibt, und Sie können alle Ihre Variablen, Felder, Methoden oder Labels benennen yield solange Ihr Namensraum es zulässt.

    – Ahmad Shahwan

    18. Oktober um 19:36 Uhr

Benutzeravatar von Andrew Tobilko
Andreas Tobilko

Fragen und Antworten

Wie kann ich es verwenden?

  1. 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;
        }
    };
    
  2. 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.

Spezifikation

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 verursacht switch 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 der Expression wird der Wert der switch 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 a yield Aussage ist ungültig (15.1).

Ausführung einer yield Anweisung wertet zuerst die aus Expression. Wenn die Auswertung der Expression schließt abrupt aus irgendeinem Grund, dann die yield Anweisung wird aus diesem Grund abrupt abgeschlossen. Bei Auswertung der Expression wird normal abgeschlossen und erzeugt einen Wert Vdann ist die yield Aussage abrupt abgeschlossen, der Grund ist eine Rendite mit Wert V.

Benutzeravatar von user7294900
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

Benutzeravatar von Vikas
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

Rickys Benutzer-Avatar
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";
}

1436180cookie-checkWas bedeutet das neue Schlüsselwort „yield“ in Java 13?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy