Vavr (anciennement Javaslang) est une bibliothèque objet-fonctionnelle, destinée aux applications codées en Java 8 et plus. Elle permet de réduire le nombre de lignes de code et d'augmenter sa qualité. Elle fournit notamment des collections immuables et des structures de contrôle orientées fonctionnelles ce qui permet de réduire les effets de bord. Nous verrons dans cet article quelques possibilité offertes par cette bibliothèque.
Les collections immuables
Toutes les collections fournies dans Vavr sont immuables, ce qui permet d'éviter les effets de bord, en particuliers dans des applications multi-threadées.
Java permet, de base, l'utilisation de collections immuables, cependant si on essaye d'ajouter des éléments dedans, une exception est levée au runtime.
Avec Vavr, lorsque l'on veut modifier une collection, celle-ci n'est pas modifiée mais une nouvelle instance est retournée.
Cela permet aussi de chaîner les appels. Exemple avec une Queue :
Outre les collections classiques de Java, Vavr propose la structure de données Tuple, qui n'a pas d'équivalent en Java. Celle-ci permet de stocker un nombre fini (jusqu'a 8) d'éléments de types différents. Pour accéder à ces éléments, il faut utiliser, par exemple la méthode t._1 pour le 1er élément, t._2 pour le 2ème, et ainsi de suite. Exemple issu de la documentation :
Les value types
En plus des collections immuables, Vavr fournit quelques types immuables.
Try
Try est une interface qui permet de wrapper un calcul pouvant retourner une valeur ou lever une exception. Un objet Try peut être de type Success ou Failure.
Exemple d'utilisation :
Lazy
Lazy est un wrapper qui représente une valeur calculée tardivement, c'est-à-dire lorsque l'on en a besoin. De plus, cela permet de mettre en cache la valeur calculée et de la retourner à chaque fois sans répéter le calcul. Par exemple :
Either
Either représente une possible valeur de deux types différents. Either a deux implémentations : Left et Right.
Par convention, les erreurs sont retournées à gauche et le résultat à droite.
Exemple : une méthode calcul() dont le résultat est soit un entier (en cas de succès) soit un message d'erreur (en cas d'échec).
Si le résultat de calcul() est Right(1), la valeur de resultat sera Right(2).
Si le résultat de calcul() est Left("erreur"), la valeur de resultat sera Left("erreur").
Future
Ce type représente le résultat d'un calcul qui devient disponible dans le futur. Chaque opération est non-bloquante. Un objet Future a deux états : pending (en attente) et completed.
On peut mettre des callbacks sur un objet Future. Ces actions sont réalisées dès que le Future atteint l'état completed. Une action ajoutée sur un Future completed est immédiatement exécutée. Pour plus d'information, voir la documentation.
Java 8 fournit seulement une classe Function qui prend un paramètre et une classe BiFunction qui en prend deux.
Vavr fournit des classes permettant de créer des fonctions jusqu'à 8 paramètres : Function0, Function1, Function2, Function3...
Exemple :
Les interfaces fonctionnelles de Vavr fournissent, en outre, les possibilités suivantes :
Pattern Matching
Le concept de pattern matching est un concept natif à la plupart des langages fonctionnels qui n'est pas inclus de base dans Java, ce qui oblige souvent à utiliser une longue suite de if ou un switch pouvant comprend un nombre de lignes important.
Le pattern matching de Vavr permet d'écrire du code plus concis et plus lisible.
Exemple d'utilisation :
Pour plus d'informations sur cette bibliothèque, consultez la documentation.
merci pour ce tuto,
Une petite erreur (cookie?) s’est glissée sur Either. Peut-être facile à corriger pour le lecteur avisé! Le guide Vavr en anglais (http://www.vavr.io/vavr-docs/#_immutable_data_structures) ne contient pas cet écart.