Vous aimez ce que vous lisez sur ce blog ?
Envie d'aller plus loin avec véritable formation d'expertise en Java ?
Venez suivre ma formation Masterclasse Expertise Java !

"Même un développeur experimenté a besoin de continuer à apprendre. Et dans cette formation... j'ai appris beaucoup !" - A.G., Java Champion

Prochaines sessions inter-entreprises : 28-31 mars 2017 / 13-16 juin 2017
Sessions intra-entreprises sur demande.
Inscrivez-vous vite !

Lambdas et Underscores

Le saviez-vous ? Il est interdit d'utiliser un simple underscore (_) comme nom de paramètre de lambda. Cela a de quoi surprendre, étant donné que c'est un nom parfaitement valide pour un champ, un paramètre de méthode, ou une variable locale.

Le paramètre "whatever"

De plus, il est très commun dans certains langages (comme Haskell ou Scala) d'utiliser un simple underscore à la place d'un paramètre pour indiquer que celui-ci n'a aucune importance, car il n'est, par exemple, pas utilisé dans le corps de la méthode ou de l'expression lambda.

Exemple en Haskell : l'underscore signifie que quelle que soit la fonction appliquée à la liste vide, le résultat sera toujours une liste vide.

Notez qu'en Haskell, l'underscore n'est pas un simple nom de variable, mais un élément du langage à part entière, géré par le compilateur. Il est ainsi tout à fait possible d'avoir plusieurs underscores simples dans la signature d'une fonction, si plusieurs paramètres doivent être ignorés.

map :: (a->b) -> [a] -> [b]
map _ []     = []
map f (x:xs) = f x : map f xs

Exemple en Scala : la fonction foreach a le même but que la fonction map vue plus haut. Ici, la fonction appliquée n'utilise pas l'élément courant qui lui est passé en paramètre, et se contente d'afficher "Hi".

List(1, 2, 3) foreach { _ => println("Hi") }

Personnellement, j'utilise ce pattern de temps à autre dans les signatures de mes méthodes Java - même si, idéalement, un paramètre inutilisé ne devrait même pas être présent. Et c'est donc en tentant de l'appliquer à une expression lambda que je me suis heurté au refus du compilateur.

Il se trame des choses côté Java

D'après la spécification Java 8 (JLS §15.27.1) :

It is a compile-time error if a lambda parameter has the name _ (that is, a single underscore character). The use of the variable name _ in any context is discouraged. Future versions of the Java programming language may reserve this name as a keyword and/or give it special semantics.

"Special semantics" ? Est-ce à dire que Java pourrait utiliser les mêmes conventions que Haskell ? Voilà qui serait intéressant !

Mais ce n'est apparemment pas pour tout de suite. Avant de donner à l'underscore une signification particulière, il faut d'abord s'assurer qu'il n'est pas utilisé comme nom de paramètre ou variable dans le code existant.

Depuis Java 8, un warning est émis pour décourager son usage :

Use of '_' as an identifier might not be supported in releases after Java 8

De plus, la JEP 213 ("Milling Project Coin") propose que

Using underscore ("_") as an identifier, which generates a warning as of Java SE 8, should be turned into an error in Java SE 9.

Bref, si l'underscore acquiert certains pouvoirs magiques un jour, ça ne sera pas avant Java 10.
Wait & see, donc...


Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.