jeudi 24 juillet 2014

Lazy Stream Generation with Java 8

Avant, pour produire les items à consommer dans une boucle for-each en Java, on pouvait utiliser un itérateur. Mais ça, c'était avant...

Depuis Java 8, le tant attendu, il y a les lambdas et l'API stream : Java rattrape enfin son retard sur nombre de langages qui offrent déjà depuis bien longtemps des mécanismes de programmation fonctionnelle. Il était temps.

Alors, comme tout Javaman qui se respecte, je me suis attelé à la tâche : essayer de domestiquer ces nouveaux compagnons. Il y a tout un tas de fonctionnalités géniales prêtes à l'emploi : on peut générer des streams à partir de tout et n'importe quoi, on peut obtenir des stream bornés ou infinis, séquentiels ou parallélisables, et on les consomme dans un mode "lazy", c'est à dire que chaque étape dans un pipeline demande à l'étape précédente la donnée à traiter qui lui-même fournira à l'étape suivante la donnée utile, ni plus ni moins : c'est du pur pull-pipeline bourrin, économe et efficace.

Mais comment produire des données dans un mode "lazy" ? Pratiquement dès le début, je me suis retrouvé comme une poule devant un violon face à cette épineuse question.

Voyons de quoi il s'agit dans un exemple concret.


Produire juste ce qu'il faut : un enjeu de chaque instant