Dans un post précédent, je vous avais parlé des différentes façons de manipuler les collections.
Suite à cet article, +Ronan Michaux  a indiqué un pointeur vers une librairie proposant des fonctionnalités vraiment intéressantes pour la manipulation de collections et plus encore.

Un peu d’histoire..
Ce projet a été initié par +Mario Fusco  en 2009. L’idée originelle du projet est d’augmenter la lisibilité du code et d’éliminer les codes répétitifs que l’on retrouve dans chaque boucle que l’on a à écrire.
Au départ, le créateur du projet a commencé par écrire des méthodes utilitaires et un petit DSL afin de rendre le code plus lisible et plus pratique à utiliser.
Les membres de l’équipe dans laquelle travaille Mario adhèrent immédiatement au projet et commence à l’utiliser quotidiennement.
Face à ce succès, il décide de refactorer ses composants et de les intégrer dans une API indépendante.
La dernière étape de cette mutation a été de choisir le nom de la librairie 🙂

Les fonctionnalités

LambdaJ permet, sur une collection, de : 

– Filtrer les éléments d’une collection, 
– Définir statiquement les propriétés d’un objet,
– Agréger les items d’une collection ou les valeurs des items,
– Joindre des chaînes de caractères,
– Transformer, indexer et trier les items d’une collection,
– Effectuer des regroupements d’items,
– Effectuer du mapping d’objet à objet.

Lorsqu’il s’agit de définir des conditions, typiquement pour la première fonctionnalité citée, LambdaJ se base sur Hamcrest, le framework utilisé principalement dans le cadre de tests unitaires sur la base d’un DSL.

L’ensemble de ces fonctionnalités, comme nous l’évoquions en introduction, vient remplacer les bonnes vieilles boucles itératives (for, while, do).

La syntaxe se base sur un DSL qui permet de rendre le code produit très clair et très expressif. Je vous laisse voir les exemples en suivant le pointeur suivant : http://code.google.com/p/lambdaj/wiki/LambdajFeatures
Comme la syntaxe, les exemples proposés sont très clairs.

Les closures

Le projet propose également une implémentation des Closures. Les closures donnent la possibilité de rendre du code générique pour 95% et de spécialiser les 5% qui restent en respectant le pattern ouvert/fermé.

Les closures proposent un certain nombre de méthodes permettant de gérer facilement le nombre de paramètres que l’on pourra transmettre à la closure.
Aussi, dans le cadre d’une closure définissant un nombre de paramètres fini, il est possible de fixer la valeur de certains de ces paramètres.

Il est possible  de caster des closures dans certaines interfaces afin de pouvoir les manipuler au travers de ces interfaces.
La liste des possibilités concernant les closures n’est pas exhaustive, je vous invite à vous référer à la documentation pour approfondir le sujet.

Étendre la librairie

LambdaJ offre plusieurs interfaces afin de pouvoir introduire les problématiques métier de chacun.

Par exemple :
– personnaliser la conversion d’objet en implémentant l’interface Converter
– enrichir un filtre en étendant la classe LambdaJMatcher

Les performances

Sur le site du projet, on peut trouver un benchmark permettant de mettre en évidence le gain apporté par LambdaJ par rapport à l’utilisation classique des boucles.

En conclusion

Je trouve que par rapport à Guava, la syntaxe proposée ainsi que les fonctionnalités dans LambdaJ sont un cran au-dessus.

Cette librairie est en avance sur son temps, si l’on considère les fonctionnalités proposées dès sa création. En effet, depuis un certain temps maintenant, l’idée d’avoir les lambda expressions natives dans Java est évoquée dans les futurs versions du JDK. Aujourd’hui, nous ne l’’avons pas encore dans le langage ; il faudra attendre la sortie de la version 8 du JDK pour cela.

En attendant, cette librairie permet d’adresser largement les possibilités  de manipulation des collections et des closures. 
Le projet a encore de beaux jours devant lui avant que la version 8 du jdk ne sorte et que celle-ci soit intégrée dans les entreprises.

De mon coté, j’ai ajouté la dépendance sur le projet sur lequel je travaille 🙂

#java #lambdaj #collection #closure #manipulation #data