Java12 est sorti, alors j'ai essayé l'expression switch pour le moment

Aperçu

Java 12 est sorti. Je pense qu'il y a divers changements et nouvelles fonctions, mais j'ai essayé l'instruction switch (ou expression switch), qui est le changement le plus évident.

point important

La façon d'écrire une nouvelle instruction switch semble être positionnée comme une fonction de prévisualisation à partir de Java 12, et vous devez ajouter des options au moment de la compilation et de l'exécution.

Au moment de la compilation

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

Durée

java --enable-preview MultiCaseSample

De plus, le contenu écrit ici est sujet à changement à l'avenir.

Contenu

Cas multiples

Vous pouvez spécifier plusieurs valeurs dans la clause case, séparées par des virgules.

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

        switch(month) {
            case 1, 2:
                System.out.println("C'est l'hiver");
                break;
            case 3, 4, 5:
                System.out.println("C'est le printemps");
                break;
            case 6, 7, 8:
                System.out.println("Le summum de l'été");
                break;
            case 9, 10, 11:
                System.out.println("Notre automne approche à grands pas!");
                break;
            case 12:
                System.out.println("C'est la fin de l'année, donc je vais commencer l'année prochaine");
                break;
            default:
                System.out.println("Il n'y a pas de mois pareil");
        }
    }
}

Syntaxe de la flèche

Écrivez la phrase après le symbole "->". Vous pouvez omettre la description des deux points et de la rupture. Il semble que vous puissiez écrire un traitement multiligne en utilisant des blocs. (Dans l'exemple ci-dessous, c'est une ligne ...) De plus, vous n'avez pas besoin d'un point-virgule après la parenthèse fermant le bloc.

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

        switch(month) {
            case 1, 2 -> System.out.println("C'est l'hiver");
            case 3, 4, 5 -> System.out.println("C'est le printemps");
            case 6, 7, 8 -> System.out.println("Le summum de l'été");
            case 9, 10, 11 -> System.out.println("Notre automne approche à grands pas!");
            case 12 -> System.out.println("C'est la fin de l'année, donc je vais commencer l'année prochaine");
            default -> {
                System.out.println("Il n'y a pas de mois pareil");
            }
        }
    }
}

type de commutateur

L'instruction switch est désormais une expression switch. La différence entre les instructions et les expressions est que la première ne renvoie pas de valeur, tandis que la seconde renvoie une valeur. Ainsi, vous pouvez affecter le résultat de l'évaluation de l'expression de commutateur à la variable telle quelle. Dans ce cas, un point-virgule est requis après la parenthèse fermante du commutateur.

De plus, si tous les modèles ne sont pas couverts (dans cet exemple, il n'y a pas de clause par défaut), une erreur de compilation se produira. C'est mieux que d'attribuer implicitement null. Si vous n'utilisez pas la syntaxe de la flèche ou n'utilisez pas de blocs, la valeur à renvoyer est décrite après break.

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

        var message = switch(month) {
            case 1, 2 -> "C'est l'hiver";
            case 3, 4, 5 -> "C'est le printemps";
            case 6, 7, 8 -> {
                break "Le summum de l'été";
            }
            case 9, 10, 11 -> "Notre automne approche à grands pas!";
            case 12 -> "C'est la fin de l'année, donc je vais commencer l'année prochaine";
            default -> "Il n'y a pas de mois pareil";
        };
        System.out.println(message);
    }
}

Apparemment, mélanger la syntaxe des flèches avec la syntaxe traditionnelle entraîne une erreur de compilation. J'ai donc écrit un modèle qui n'utilise pas la syntaxe des flèches séparément.

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

        var message = switch(month) {
            case 1, 2:
                break "C'est l'hiver";
            case 3, 4, 5:
                break "C'est le printemps";
            case 6, 7, 8:
                break "Le summum de l'été";
            case 9, 10, 11:
                break "Notre automne approche à grands pas!";
            case 12:
                break "C'est la fin de l'année, donc je vais commencer l'année prochaine";
            default:
                break "Il n'y a pas de mois pareil";
        };
        System.out.println(message);
    }
}

D'autres choses qui m'intéressaient

La valeur par défaut est-elle inutile lors de l'énumération de tous les éléments avec Enum?

Même sans valeur par défaut, cela a fonctionné sans aucune erreur au moment de la compilation et de l'exécution.

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 -> "C'est l'hiver";
            case MARCH, APRIL, MAY -> "C'est le printemps";
            case JUNE, JULY, AUGUST -> "Le summum de l'été";
            case SEPTEMBER, OCTOBER, NOVEMBER -> "Notre automne approche à grands pas!";
            case DECEMBER -> "C'est la fin de l'année, donc je vais commencer l'année prochaine";
        };
        System.out.println(message);
    }
}

Que se passe-t-il si la condition de commutation est nulle en premier lieu?

C'est un modèle qui est possible depuis longtemps quelle que soit cette version, mais dans l'exemple Enum ci-dessus, il n'y a pas de cas où il est nul, et je me demandais s'il peut être dit qu'il est couvert.

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 -> "C'est l'hiver";
            case MARCH, APRIL, MAY -> "C'est le printemps";
            case JUNE, JULY, AUGUST -> "Le summum de l'été";
            case SEPTEMBER, OCTOBER, NOVEMBER -> "Notre automne approche à grands pas!";
            case DECEMBER -> "C'est la fin de l'année, donc je vais commencer l'année prochaine";
        };
        System.out.println(message);
    }
}

Le résultat était le suivant. (Slimy dans la partie commutateur (mois)) Eh bien, c'est vrai.

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

(Ajouté le 21 mai 2019) Une erreur se produira-t-elle si Enum ne couvre pas tous les éléments?

Le motif essentiel fuyait ... Commentez-le et voyez ce qui se passe.

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 -> "C'est l'hiver";
            case MARCH, APRIL, MAY -> "C'est le printemps";
            case JUNE, JULY, AUGUST -> "Le summum de l'été";
            case SEPTEMBER, OCTOBER, NOVEMBER -> "Notre automne approche à grands pas!";
        //    case DECEMBER -> "C'est la fin de l'année, donc je vais commencer l'année prochaine";
        };
        System.out.println(message);
    }
}

Les résultats sont les suivants. Après tout, cela semble être une erreur de compilation. C'est utile car cela empêche les bogues causés par les fuites. Il ne semble pas vous dire exactement quel élément manque.

 SwitchExpressionEnumSample.java:11: Erreur: l'expression de commutateur ne couvre pas toutes les valeurs d'entrée possibles
        var message = switch(month) {
                      ^

(Ajouté le 26 septembre 2019) Modifications dans Java 13

Java 13 a été publié, mais les fonctionnalités de style Switch restent en préversion. Cependant, il y a quelques changements dans la grammaire, je vais donc l'ajouter.

Si vous n'utilisez pas la syntaxe des flèches ou n'utilisez pas de blocs, la valeur à renvoyer est décrite après break.

Changé dans Java 13 pour utiliser yield au lieu de break.

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

        var message = switch(month) {
            case 1, 2 -> "C'est l'hiver";
            case 3, 4, 5 -> "C'est le printemps";
            case 6, 7, 8 -> {
                yield "Le summum de l'été";
                //↑ Ce
            }
            case 9, 10, 11 -> "Notre automne approche à grands pas!";
            case 12 -> "C'est la fin de l'année, donc je vais commencer l'année prochaine";
            default -> "Il n'y a pas de mois pareil";
        };
        System.out.println(message);
    }
}

(Ajouté le 2020/3/18) Java 14 est sorti

Avec la sortie de Java14, les expressions de commutation sont devenues une fonctionnalité formelle. Il semble que les spécifications ne changeront pas à partir de Java 13.

Impressions

J'ai pensé que c'était pratique. (Konami) Vous pouvez empêcher le bogue provoqué par l'omission de rupture en utilisant la syntaxe de la flèche et vous pouvez empêcher le bogue causé par l'omission du modèle de valeur en remplaçant le résultat de l'expression de commutateur tel quel. De plus, dans le passé, il existait une technique pour vous laisser tomber sans écrire de pause, et si vous utilisez la syntaxe de la flèche, vous ne pouvez pas le faire, mais je pense que ce ne sera pas un problème car vous pouvez spécifier plusieurs cas.

Lien de référence

Recommended Posts

Java12 est sorti, alors j'ai essayé l'expression switch pour le moment
Java14 est sorti, alors j'ai essayé d'enregistrer pour le moment
J'ai essayé de toucher Docker pour la première fois
Utilisez une bibliothèque Java externe pour le moment
Exécutez Dataflow, Java, Streaming pour le moment
Je veux que vous utilisiez Scala comme meilleur Java pour le moment
[Rails] J'ai essayé d'utiliser la méthode button_to pour la première fois
J'ai essayé le framework Java "Quarkus"
Introduction à Java pour la première fois # 2
J'ai essayé le mappeur d'objets de Cassandra pour Java
Java9 était inclus, j'ai donc essayé jshell.
J'ai essayé le nouveau yuan à Java
Apprendre pour la première fois java [Introduction]
Liste de réglages de Glassfish que je souhaite conserver pour le moment
[First Java] Créez quelque chose qui fonctionne avec Intellij pour le moment
Installez Amazon Corretto (préversion) pour le moment
[Deep Learning from scratch] en Java 1. Pour le moment, différenciation et différenciation partielle
J'ai essayé d'utiliser la boîte à outils de migration pour les fichiers binaires d'application
Apprentissage pour la première fois des expressions et opérateurs Java # 3
Essayez d'exécuter Spring Cloud Config pour le moment
J'ai essayé d'utiliser l'instruction Extended for en Java
Mémo d'apprentissage lors de l'apprentissage de Java pour la première fois (mémo d'apprentissage personnel)
J'ai essayé d'implémenter la méthode de division mutuelle d'Eugrid en Java
Commande pour essayer d'utiliser Docker pour le moment
J'ai essayé de découvrir ce qui avait changé dans Java 9
J'ai fini de regarder les roses de Versailles, alors j'ai essayé de reproduire la chanson de fin en Java
Accédez à l'API Web avec Get sur Android et traitez Json (Java pour le moment)
J'ai traduit [Méthode Clone pour les tableaux Java] comme méthode Clone dans les tableaux Java.
[JDBC] J'ai essayé d'accéder à la base de données SQLite3 depuis Java.
J'ai essayé de résumer les bases de kotlin et java
Hello World avec la bibliothèque d'extension Ruby pour le moment
Java SE 13 (JSR388) est sorti alors je l'ai essayé
Revue Java ③ (syntaxe de contrôle [if / switch / while / for], expression conditionnelle)
J'ai essayé d'utiliser la bibliothèque CameraX avec Android Java Fragment
[Memo] Exécutez Node.js v4.4.5 sur CentOS 4.9 / RHEL4 (i386) pour le moment (gcc-4.8 et glibc2.11 sur LinuxKernel 2.6.9)
J'ai essayé Drools (Java, InputStream)
J'ai essayé d'utiliser Java REPL
J'ai essayé le problème FizzBuzz
[Java] J'ai essayé d'implémenter la combinaison.
J'ai étudié le constructeur (java)
J'ai essayé la métaprogrammation avec Java
J'ai réussi le test Java niveau 2, je vais donc laisser une note
J'ai essayé le type d'entrée / sortie de Java Lambda ~ Map edition ~
J'ai essayé de traduire le message d'erreur lors de l'exécution d'Eclipse (Java)
J'ai essayé de résumer les méthodes de Java String et StringBuilder
[Java] J'ai essayé de faire un labyrinthe par la méthode de creusage ♪
J'ai essayé d'exécuter le formulaire FaaS compatible Java "Fn Project"
Depuis que j'ai réussi l'Oracle Java Bronze, j'ai résumé les grandes lignes du test.
J'ai essayé d'afficher le calendrier sur la console Eclipse en utilisant Java.