samedi 13 mars 2010

Petit amusement programmatique avec Google Collections (1)

Google Collections est une bibliothèque fort sympathique et bien utile. Ce billet de Benjamin Wintenberg et celui-ci sur le Jayway Team Blog en présente plus en détail que le mien ce qu'offre cette nouvelle bibliothèque de Google .

Mon objectif est plus ici de m'amuser un peu avec Google Collections sur un petit cas concret. En l'occurrence ici le problème 1 du Projet Euler.
Il s'agit ici de déterminer la somme de tous les entiers naturels strictement inférieurs à 1000 qui sont multiples de 3 ou de 5.

La classe principale qui implémente une solution possible avec utilisation de l'API Google Collections :


La classe de tests (JUnit4) associée :


Regardons tout cela d'un peu plus près. La partie vraiment intéressante est la méthode solve.

Cette méthode comme son nom l'indique résout notre problème.
On crée d'abord une liste des nombres entiers de 0 à 999. Le "Lists.newArrayList();" vient de Google Collections. C'est plutôt explicite, la méthode statique newArrayList me retourne une instance de ArrayList (ici une ArrayList) que l'on se contente ensuite d'initialiser avec les nombres de 0 à 999.
Puis on crée une nouvelle liste à partir de la première liste. On utilise toujours Lists.newArrayList mais cette fois-ci avec en paramètre un Iterable. Ce paramètre Iterable correspondra concrètement à notre liste précédente filtrée pour ne garder que les multiples de 3 ou de 5. Pour se faire on utilise la méthode statique filter de la classe Iterables disponible dans Google Collection. Cette méthode filter prend en paramètre la liste à filtrer et un objet implémentant l'interface Predicat matérialisée ici par l'instanciation d'une classe anonyme implémentant une méthode apply. Cette méthode apply doit retourner un booléen et sera appliquée sur chaque élément de la liste passée en paramètre de la méthode filter : tous les éléments pour lesquels la méthode apply retournera false seront filtrés. Une fois que l'on a la liste filtrée, c'est fini. Il n'y a plus qu'à faire la somme des éléments pour trouver le résultat.

Voilà, rien de bien extraordinaire, c'est certain. L'intérêt est ici de voir un petit exemple d'utilisation de l'API Google Collections (qui - je vous rassure - propose bien d'autres choses) et les possibilités de pouvoir avoir une approche fonctionnelle en Java. D'ailleurs puisque l'on parle d'approche fonctionnelle en Java, un billet sur le blog de Xebia à propos de la sortie de Google Collections en finale 1.0 renvoyait vers 2 projets qui concernent une approche fonctionnelle en Java : Lambdaj et Functional Java. Avis aux amateurs !