logo le blog invivoo blanc

Java Pattern Matching

27 septembre 2023 | Java | 0 comments

Lors de la 11ème édition du Devoxx Paris, organisée au Palais des Congrès du 12 au 14 avril 2023, José Paumard et Remi Forax ont présenté une conférence sur le Pattern Matching.

José Paumard : membre du Java Platform Group chez Oracle en tant que Java Developer Advocate

Remi Forax : Java Champion et enseignant-chercheur spécialisé sur le langage Java

Le pattern matching est une fonctionnalité introduite en Java 16 qui permet de simplifier et d’améliorer les vérifications de types et les extractions d’informations à partir d’objets. En bref, il facilite la manipulation de données en correspondant à des motifs spécifiques dans les expressions.

Voici ses principales caractéristiques en Java :

Instance of :

Avant Java 16, lorsqu’on voulait vérifier si un objet était une instance d’un certain type et extraire des informations de cet objet, on utilisait l’opérateur instanceof suivi d’un cast explicite. Maintenant, il est possible avec le pattern matching d’effectuer cette vérification et l’extraction d’informations en une seule étape, rendant le code plus concis et plus lisible.

if (obj instanceof MyClass myObj) {
    // Utilisation de la variable myObj pour accéder aux membres de l'objet
    System.out.println(myObj.getName());
    myObj.doSomething();
}

Lorsqu’on l’utilise avec instanceof, une variable peut alors être déclarée directement dans l’expression conditionnelle. Cette variable sera automatiquement initialisée avec la valeur de l’objet casté si la correspondance est réussie. Finalement, cela évite d’avoir à répéter le nom de la variable et facilite l’accès aux membres de l’objet correspondant.

Pattern Matching dans les instructions switch :

Il peut également être utilisé dans les instructions switch pour simplifier les comparaisons multiples. Les motifs peuvent être utilisés pour tester si une variable correspond à certains modèles spécifiques et effectuer des actions en conséquence.

// Avant Java 21
static String formatter(Object obj) {
    String formatted = "unknown";
    if (obj instanceof Integer i) {
        formatted = String.format("int %d", i);
    } else if (obj instanceof Long l) {
        formatted = String.format("long %d", l);
    } else if (obj instanceof Double d) {
        formatted = String.format("double %f", d);
    } else if (obj instanceof String s) {
        formatted = String.format("String %s", s);
    }
    return formatted;
}
// Java 21
static String formatterPatternSwitch(Object obj) {
    return switch (obj) {
        case Integer i -> String.format("int %d", i);
        case Long l    -> String.format("long %d", l);
        case Double d  -> String.format("double %f", d);
        case String s  -> String.format("String %s", s);
        default        -> obj.toString();
    };
}

Conclusion

En conclusion, le pattern matching en Java apporte de nombreux avantages :

  • Une syntaxe plus claire et expressive.
  • Une réduction de la duplication de code.
  • Une meilleure lisibilité et une diminution des risques d’erreurs.
  • Il facilite également l’écriture de code plus concis et maintenable.