Java12 kam heraus, also habe ich vorerst den Schalterausdruck ausprobiert

Überblick

Java 12 ist raus. Ich denke, es gibt verschiedene Änderungen und neue Funktionen, aber ich habe die switch-Anweisung (oder den switch-Ausdruck) ausprobiert, die die offensichtlichste Änderung ist.

wichtiger Punkt

Die Art und Weise, eine neue switch-Anweisung zu schreiben, scheint ab Java 12 als Vorschaufunktion positioniert zu sein, und Sie müssen Optionen zur Kompilierungs- und Laufzeit hinzufügen.

Zur Kompilierungszeit

javac --enable-preview --release 12  MultiCaseSample.java

Laufzeit

java --enable-preview MultiCaseSample

Auch der hier geschriebene Inhalt kann sich in Zukunft ändern.

Inhalt

Mehrere Fälle

Sie können in der case-Klausel mehrere Werte angeben, die durch Kommas getrennt sind.

public class MultiCaseSample {
    public static void main(String[] args) {
        var month = Integer.parseInt(args[0]);

        switch(month) {
            case 1, 2:
                System.out.println("Es ist Winter");
                break;
            case 3, 4, 5:
                System.out.println("Es ist Frühling");
                break;
            case 6, 7, 8:
                System.out.println("Der Höhepunkt des Sommers");
                break;
            case 9, 10, 11:
                System.out.println("Unser Herbst steht vor der Tür!");
                break;
            case 12:
                System.out.println("Es ist das Ende des Jahres, also werde ich nächstes Jahr anfangen");
                break;
            default:
                System.out.println("Es gibt keinen solchen Monat");
        }
    }
}

Pfeilsyntax

Schreiben Sie den Satz nach dem Symbol "->". Sie können die Beschreibung von Doppelpunkt und Unterbrechung weglassen. Es scheint, dass Sie die mehrzeilige Verarbeitung mithilfe von Blöcken schreiben können. (Im folgenden Beispiel ist es eine Zeile ...) Außerdem benötigen Sie nach dem Klammern zum Schließen des Blocks kein Semikolon.

public class ArrowSample {
    public static void main(String[] args) {
        var month = Integer.parseInt(args[0]);

        switch(month) {
            case 1, 2 -> System.out.println("Es ist Winter");
            case 3, 4, 5 -> System.out.println("Es ist Frühling");
            case 6, 7, 8 -> System.out.println("Der Höhepunkt des Sommers");
            case 9, 10, 11 -> System.out.println("Unser Herbst steht vor der Tür!");
            case 12 -> System.out.println("Es ist das Ende des Jahres, also werde ich nächstes Jahr anfangen");
            default -> {
                System.out.println("Es gibt keinen solchen Monat");
            }
        }
    }
}

Schaltertyp

Die switch-Anweisung ist jetzt ein switch-Ausdruck. Der Unterschied zwischen Anweisungen und Ausdrücken besteht darin, dass erstere keinen Wert zurückgeben, während letztere einen Wert zurückgeben. Sie können also das Bewertungsergebnis des switch-Ausdrucks der Variablen so wie sie ist zuweisen. In diesem Fall ist nach der schließenden Klammer des Schalters ein Semikolon erforderlich.

Wenn nicht alle Muster abgedeckt sind (in diesem Beispiel gibt es keine Standardklausel), tritt ein Kompilierungsfehler auf. Es ist besser, als implizit null zuzuweisen. Wenn Sie die Pfeilsyntax nicht verwenden oder keine Blöcke verwenden, wird der zurückzugebende Wert nach break beschrieben.

public class SwitchExpressionSample {
    public static void main(String[] args) {
        var month = Integer.parseInt(args[0]);

        var message = switch(month) {
            case 1, 2 -> "Es ist Winter";
            case 3, 4, 5 -> "Es ist Frühling";
            case 6, 7, 8 -> {
                break "Der Höhepunkt des Sommers";
            }
            case 9, 10, 11 -> "Unser Herbst steht vor der Tür!";
            case 12 -> "Es ist das Ende des Jahres, also werde ich nächstes Jahr anfangen";
            default -> "Es gibt keinen solchen Monat";
        };
        System.out.println(message);
    }
}

Anscheinend führt das Mischen der Pfeilsyntax mit der herkömmlichen Syntax zu einem Kompilierungsfehler. Also habe ich ein Muster geschrieben, das die Pfeilsyntax nicht separat verwendet.

public class SwitchExpressionBreakSample {
    public static void main(String[] args) {
        var month = Integer.parseInt(args[0]);

        var message = switch(month) {
            case 1, 2:
                break "Es ist Winter";
            case 3, 4, 5:
                break "Es ist Frühling";
            case 6, 7, 8:
                break "Der Höhepunkt des Sommers";
            case 9, 10, 11:
                break "Unser Herbst steht vor der Tür!";
            case 12:
                break "Es ist das Ende des Jahres, also werde ich nächstes Jahr anfangen";
            default:
                break "Es gibt keinen solchen Monat";
        };
        System.out.println(message);
    }
}

Andere Dinge, die mich interessierten

Ist die Standardeinstellung beim Auflisten aller Elemente mit Enum nicht erforderlich?

Auch ohne Standardeinstellung funktionierte es zur Kompilierungs- und Laufzeit fehlerfrei.

public class SwitchExpressionEnumSample {

    private enum Month {
        JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE,
        JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER,
    }

    public static void main(String[] args) {
        var month = Month.values()[Integer.parseInt(args[0])];

        var message = switch(month) {
            case JANUARY, FEBRUARY -> "Es ist Winter";
            case MARCH, APRIL, MAY -> "Es ist Frühling";
            case JUNE, JULY, AUGUST -> "Der Höhepunkt des Sommers";
            case SEPTEMBER, OCTOBER, NOVEMBER -> "Unser Herbst steht vor der Tür!";
            case DECEMBER -> "Es ist das Ende des Jahres, also werde ich nächstes Jahr anfangen";
        };
        System.out.println(message);
    }
}

Was passiert, wenn die Schalterbedingung überhaupt null ist?

Es ist ein Muster, das unabhängig von dieser Version schon lange möglich war, aber ich habe mich gefragt, ob das obige Enum-Beispiel keinen Fall von Null enthält und von diesem abgedeckt werden kann.

public class SwitchExpressionNullSample {

    private enum Month {
        JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE,
        JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER,
    }

    public static void main(String[] args) {
        Month month = null;

        var message = switch(month) {
            case JANUARY, FEBRUARY -> "Es ist Winter";
            case MARCH, APRIL, MAY -> "Es ist Frühling";
            case JUNE, JULY, AUGUST -> "Der Höhepunkt des Sommers";
            case SEPTEMBER, OCTOBER, NOVEMBER -> "Unser Herbst steht vor der Tür!";
            case DECEMBER -> "Es ist das Ende des Jahres, also werde ich nächstes Jahr anfangen";
        };
        System.out.println(message);
    }
}

Das Ergebnis war wie folgt. (Schleimig im Schalterteil (Monat)) Nun, das stimmt.

Exception in thread "main" java.lang.NullPointerException
        at SwitchExpressionNullSample.main(SwitchExpressionNullSample.java:11)

(Hinzugefügt am 21. Mai 2019) Tritt ein Fehler auf, wenn Enum nicht alle Elemente abdeckt?

Das wesentliche Muster war undicht ... Kommentieren Sie es aus und sehen Sie, was passiert.

public class SwitchExpressionEnumSample {

    private enum Month {
        JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE,
        JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER,
    }

    public static void main(String[] args) {
        var month = Month.values()[Integer.parseInt(args[0])];

        var message = switch(month) {
            case JANUARY, FEBRUARY -> "Es ist Winter";
            case MARCH, APRIL, MAY -> "Es ist Frühling";
            case JUNE, JULY, AUGUST -> "Der Höhepunkt des Sommers";
            case SEPTEMBER, OCTOBER, NOVEMBER -> "Unser Herbst steht vor der Tür!";
        //    case DECEMBER -> "Es ist das Ende des Jahres, also werde ich nächstes Jahr anfangen";
        };
        System.out.println(message);
    }
}

Die Ergebnisse sind wie folgt. Immerhin scheint es ein Kompilierungsfehler zu sein. Es ist hilfreich, weil es Fehler verhindert, die durch Lecks verursacht werden. Es scheint Ihnen nicht genau zu sagen, welches Element fehlt.

 SwitchExpressionEnumSample.java:11: Fehler: Der Schalterausdruck deckt nicht alle möglichen Eingabewerte ab
        var message = switch(month) {
                      ^

(Hinzugefügt am 26. September 2019) Änderungen in Java 13

Java 13 wurde veröffentlicht, aber Funktionen im Switch-Stil bleiben in der Vorschau. Es gibt jedoch einige Änderungen in der Grammatik, daher werde ich sie hinzufügen.

Wenn Sie keine Pfeilsyntax oder keine Blöcke verwenden, wird der zurückzugebende Wert nach break beschrieben.

In Java 13 wurde geändert, um "Yield" anstelle von "Break" zu verwenden.

public class SwitchExpressionSample {
    public static void main(String[] args) {
        var month = Integer.parseInt(args[0]);

        var message = switch(month) {
            case 1, 2 -> "Es ist Winter";
            case 3, 4, 5 -> "Es ist Frühling";
            case 6, 7, 8 -> {
                yield "Der Höhepunkt des Sommers";
                //↑ Dies
            }
            case 9, 10, 11 -> "Unser Herbst steht vor der Tür!";
            case 12 -> "Es ist das Ende des Jahres, also werde ich nächstes Jahr anfangen";
            default -> "Es gibt keinen solchen Monat";
        };
        System.out.println(message);
    }
}

(Hinzugefügt am 18.03.2020) Java 14 veröffentlicht

Mit der Veröffentlichung von Java14 sind Schalterausdrücke zu einem formalen Merkmal geworden. Es scheint, dass sich die Spezifikationen von Java 13 nicht ändern werden.

Impressionen

Ich fand es bequem. (Konami) Sie können den durch das Auslassen von Unterbrechungen verursachten Fehler mithilfe der Pfeilsyntax verhindern und den durch das Auslassen von Wertemustern verursachten Fehler verhindern, indem Sie das Ergebnis des Schalterausdrucks so ersetzen, wie es ist. In der Vergangenheit gab es auch eine Technik, mit der Sie ohne Unterbrechung durchfallen konnten. Wenn Sie die Pfeilsyntax verwenden, können Sie dies nicht tun, aber ich denke, dass dies kein Problem darstellt, da Sie mehrere Fälle angeben können.

Referenzlink

Recommended Posts

Java12 kam heraus, also habe ich vorerst den Schalterausdruck ausprobiert
Java14 kam heraus, also habe ich vorerst versucht aufzunehmen
Ich habe zum ersten Mal versucht, Docker zu berühren
Verwenden Sie vorerst eine externe Java-Bibliothek
Führen Sie jetzt Dataflow, Java, Streaming aus
Ich möchte, dass Sie Scala vorerst als besseres Java verwenden
[Rails] Ich habe zum ersten Mal versucht, die button_to-Methode zu verwenden
Ich habe das Java-Framework "Quarkus" ausprobiert.
Einführung in Java zum ersten Mal # 2
Ich habe Cassandras Object Mapper für Java ausprobiert
Java9 war enthalten, also habe ich jshell ausprobiert.
Ich habe das neue Yuan-Problem in Java ausprobiert
Zum ersten Mal Java lernen [Einführung]
Glassfish Tuning List, die ich vorerst behalten möchte
[Erstes Java] Machen Sie etwas, das vorerst mit Intellij funktioniert
Installieren Sie vorerst Amazon Corretto (Vorschau)
[Deep Learning von Grund auf neu] in Java 1. Zur Zeit Differenzierung und teilweise Differenzierung
Ich habe versucht, das Migration Toolkit für Anwendungsbinärdateien zu verwenden
Zum ersten Mal lernen Java # 3 Ausdrücke und Operatoren
Versuchen Sie vorerst, Spring Cloud Config auszuführen
Ich habe versucht, die erweiterte for-Anweisung in Java zu verwenden
Lernnotiz beim ersten Lernen von Java (persönliches Lernnotiz)
Ich habe versucht, die Methode der gegenseitigen Teilung von Eugrid in Java zu implementieren
Befehl, um Docker vorerst zu verwenden
Ich habe versucht herauszufinden, was sich in Java 9 geändert hat
Ich habe mir die Rosen von Versailles angesehen und versucht, das Schlusslied in Java zu reproduzieren
Greifen Sie mit Get on Android auf die Web-API zu und verarbeiten Sie Json (vorerst Java).
Ich habe [Klonmethode für Java-Arrays] als Klonmethode in Java-Arrays übersetzt.
[JDBC] Ich habe versucht, von Java aus auf die SQLite3-Datenbank zuzugreifen.
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Hallo Welt mit Ruby-Erweiterungsbibliothek vorerst
Java SE 13 (JSR388) wurde veröffentlicht, also habe ich es versucht
Java-Überprüfung ③ (Steuerungssyntax [if / switch / while / for], bedingter Ausdruck)
Ich habe versucht, die CameraX-Bibliothek mit Android Java Fragment zu verwenden
[Memo] Führen Sie Node.js v4.4.5 vorerst unter CentOS 4.9 / RHEL4 (i386) aus (gcc-4.8 und glibc2.11 unter LinuxKernel 2.6.9).
Ich habe Drools (Java, InputStream) ausprobiert.
Ich habe versucht, Java REPL zu verwenden
Ich habe das FizzBuzz-Problem ausprobiert
[Java] Ich habe versucht, die Kombination zu implementieren.
Ich habe den Konstruktor (Java) studiert.
Ich habe versucht, Metaprogrammierung mit Java
Ich habe den Java-Test Level 2 bestanden und werde eine Notiz hinterlassen
Ich habe den Eingabe- / Ausgabetyp von Java Lambda ~ Map Edition ~ ausprobiert
Ich habe versucht, die Fehlermeldung beim Ausführen von Eclipse (Java) zu übersetzen.
Ich habe versucht, die Methoden von Java String und StringBuilder zusammenzufassen
[Java] Ich habe versucht, mit der Grabmethode ein Labyrinth zu erstellen ♪
Ich habe versucht, das Java-kompatible FaaS-Formular "Fn Project" auszuführen.
Seit ich Oracle Java Bronze bestanden habe, habe ich die Umrisse des Tests zusammengefasst.
Ich habe versucht, den Kalender mit Java auf der Eclipse-Konsole anzuzeigen.