DEVOXX 2015 : “Traitement de données en Java 8”

Java8-Logo

Comme tout Développeur Java, j’ai attendu pendant longtemps les lambdas, Streams et Java 8. J’ai travaillé avec des outils Big Data tels que Flume Java et Map Reduce, et plus récemment avec JavaScript : ces technologies fournissent des fonctions map-filtre-reduce. Maintenant qu’elles sont nativement intégrées à Java, j’ai eu envie d’assister à la conférence proposée par José Paumard sur « Java, JVM, Javas SE/EE » lors de mon passage au Devoxx 2015.

Une des fonctionnalités les plus puissantes de Java 8 est sans conteste Streams module. Comme José Paumard l’a décrit, Streams fournit une solution pour traiter les gros volumes de données avec efficacité et facilité, en fournissant les fonctions Map/Reduce/Filter form et la parallélisation des traitements.

Sa présentation s’est focalisée sur trois aspects du problème en question :

  • Streams API ;
  • GS Collections ;
  • RxJava.

Streams et GS Collections ont pour but de traiter efficacement les structures de données alors que RxJava, par définition, est une bibliothèque pour utiliser conjointement des programmes asynchrones et event-based en utilisant des observable sequences.

L’API Streams

L’API Streams fournit des interfaces et des méthodes simples mais puissantes qui permettent une manipulation des données beaucoup plus aisée qu’avec l’API Collections. Une des fonctionnalités les plus marquantes est l’interface Collectors. On peut par exemple citer Group By et/ou la somme des autres attributs. Les Collectors peuvent être multiples, cumulatifs, et sont « lazy », c’est à dire qu’ils ne seront invoqués et exécutés que lorsque les résultats sont demandés. L’un des autres points importants est la facilité d’utilisation de la parallélisation des traitements. En appelant iterable.stream().parallel(), la JVM va exécuter toutes les transformations en parallèle, en créant des Threads utilisant tous les CPUS et les cores disponibles. Enfin, un nouveau concept apparaît : le Spliterator, avec lequel nous pouvons définir un Splitterable Iterator. Cet itérateur a la possibilité d’être partitionné et donc parcouru de manière parallèle.

GS Collections

https://github.com/goldmansachs/gs-collections

GS Collections est par définition « un supplément ou un remplacement du framework Java Collections ». Créé par Goldman Sachs en 2004, GS Collections fournit des implémentations basées sur le framework SmallTalk Collections, de la même manière que Google le fait avec Guava. Bags, Multimaps, MutableSets (etc.) sont des implémentations qui utilisent les Lambdas Java 8 pour fournir une puissante bibliothèque de gestion des collections. GS Collections peut aussi traiter les données en  lazy et permet la parrallélisation des traitements sur certaines interfaces.

RxJava

https://github.com/ReactiveX/RxJava

Comme évoqué lors de la présentation, TxJava est une implémentation du pattern Reactor. Il est possible de définir un Observer qui souscrit à un Observable notifié de tout changement et qui agit en conséquence. La bibliothèque est très complète et complexe, et José Paumard a très bien expliqué ces points clés. Une des remarques les plus importantes est que RxJava créé des Deamon Threads pour traiter les données, ce qui signifie que ces Threads n’existeront que si le Threads principal existe. Enfin, un Observable peut avoir plusieurs Observers, contrairement à l’API Streams qui ne peut en n’avoir qu’un, ce qui constitue un avantage.

Les trois options sont différentes et il faut évaluer précisément le besoin afin d’en choisir une :

  • L’API Stream est très simple d’utilisation et le code facile à comprendre ;
  • GS Collections reste assez simple avec l’utilisation des Lambas Java 8, comme l’API Streams ;
  • Si le besoin est de transformer des données comme le permettent Streams ou GS Collection, RxJava demandera un code plus complexe et moins efficace.

La présentation s’est illustrée par quelques tests simples de performance. L’API Streams a montré les meilleurs résultats, que ce soit en temps de réponse ou en consommation mémoire. Juste derrière, GS Collection montre également de bonnes performances. RxJava répond à d’autres problèmes : il est donc difficile de le comparer aux deux premiers.

Retrouvez les slides de la présentation : ici !

Share
Ariel GUELFI
Ariel GUELFI

1465

Leave a Reply

Your email address will not be published. Required fields are marked *