Si on parle de ce genre de chose, ça existe en Java 8 et aussi en Kotlin sous le terme de Function References.
En fait les Function references
sont présentes depuis un bon moment, mais ce n’est pas ce dont je parlais, je parlais vraiment des method references
.
Genre si j’ai un objet foo
de type Foo
qui possède une méthode Integer bar(String s)
, en Java 8 je peux écrire Foo foo = new Foo(); Function<String, Integer> baz = foo::bar;
. Donc la référence de méthode sur l’objet instancié. Je peux même écrire BiFunction<Foo, String, Integer> baz = Foo::bar;
.
En gros en Java 8 j’ai 3 types de références :
-
les références de fonction (pures) => en gros des références de méthode vers des méthodes statiques, ça c’est présent en Kotlin, depuis pas mal de temps et ça colle bien avec l’approche fonctionnelle. Exemple : System.out::println
-
les références de méthode sur un objet instancié, genre "something"::length
-
les références de constructeur (qui mappe sur un Supplier
ou une Function
) genre : String::new
-
les références de type, genre String::length
Jusqu’à Kotlin 1.1 j’avais juste trouvé la première et la troisième fonctionnalité. Top quand tu travailles avec Kotlin "tout seul" (et donc très orienté fonctionnel) par contre un peu pénible pour l’interopérabilité avec des libs "orientées objet".
Apparemment en Kotlin 1.1 ils vont ajouter le second, tant mieux !!
Le truc qui me manquait en Kotlin, à voir si ça va arriver avec Kotlin 1.1, c’est l’association entre une lambda (au sens Kotlin du terme) et une @FunctionalInterface
de Java 8 (encore une fois pour l’interopérabilité), ça, ça serait excellent.
mais je ne me rappelle pas m’être dit que ça m’aurait vraiment servi un jour.
Ca arrive quand même, et ça permet vraiment de jouer avec ce que j’appelle (sans doute à tort) des "mixins" : List<String | Number>
, Function<Closeable & Readable>
et du coup de se passer de l’héritage "conventionnel" parent <-> enfant, en composant très simplement des comportements.
Y’a encore quelques trucs où en Scala ou en Ceylon je me dis : waouh, c’est sacrément chouette, mais qui me manquent en Kotlin, ça viendra certainement, le langage est très prometteur. Les extensions sont vraiment une feature top du langage, mais il reste juste quelques micro-points gênants pour que ce soit totalement parfait.
EDIT :
Par ricochet, j’ai découvert le PureScript, qui est globalement un Haskell pour le web (à ne pas confondre avec ghcjs, qui compile effectivement du Haskell vers du javascript ; ici c’est un langage différent, très très proche, j’ai pu m’en rendre compte quand j’ai porté un parseur d’Haskell vers PureScript, nais différent tout de même). Ils ont des libs vraiment sympas : j’ai adoré Halogen, qui est globalement une espèce de React très fortement typé.
Si jamais t’as du temps et envie, regarde Elm. C’est vraiment l’approche React + Redux, mais en lieu et place des composants, tu trouveras des fonctions pures. A la place des JSX, une lib Html
qui possède des fonctions div
, span
, etc. Super facile de jouer avec canvas et webgl. Je ne connais pas PureScript, donc je ne veux surtout pas dresser de comparaison, mais ça serait top d’avoir une comparaison de quelqu’un qui connaît les deux !