Devoxx FRANCE 2014 – Java 8 Streams & Collectors : patterns, performances, parallélisation

Depuis le 18 mars dernier, Java 8 est enfin disponible en version RELEASE. Avec cette nouvelle version de JAVA, une multitude de nouveautés arrive. La plus connue est l'apport des lambdas expressions mais il n'y a pas que cela dans Java 8.

En effet, cette version met l'accent sur l'utilisation optimisée des nouvelles architectures multi-coeurs de nos ordinateurs.
C'est en ce sens que l'API Collection vieille de plus de 15 ans a été relookée en mars dernier.

Avant de rentrer dans le détail de ce changement sur les collections Java, Jose Paumard, le speaker, nous explique que l'apparition de certaines nouveautés dans le langage pourraient avoir pour origine la volonté de changer l'API collection sans casser sa rétrocompatibilité.

Ainsi quelques nouveautés (hormis les lambdas et les méthodes références) sont:

  • l'héritage multiple d'implémentations (à ne pas confondre avec l'héritage multiple d'états comme en c++). Cela se traduit par l'arrivée de méthode par défaut au sein des interfaces:

public interface A { void methode(); default void defaultMethode() { System.out.println("Ceci est une méthode par défaut"); }}

  • l'ajout de méthode statique au sein des interfaces. Désormais il faudra se faire à l'idée de pouvoir écrire de deux manières un "hello world":

public static final class Main { public static void main (String... args) { System.out.println("Hello world");} }
public interface Main { static void main (String... args) { System.out.println("Hello world");} }

  • les interfaces fonctionnelles (@FunctionalInterface) permettant à une interface de certifier qu'elle ne définit qu'une seule méthode. Si une interface fonctionnelle implémente plus d'une méthode, le compilateur renverra une erreur.
  • le type Optional<T>. Il s'agit d'un objet pouvant contenir ou pas une valeur non null.

La première modification d'importance sur l'API collection provient en réalité de l'interface Iterable, implémentation directe du pattern Iterator (du célèbre GOF). Cette dernière a été enrichie d'une fonction forEach permettant d'implémenter le pattern Visitor. Cette fonctionnalité permet donc d' appliquer un ensemble d'opérations à un ensemble d'objets nativement au sein de Java 8. Ce regroupement a pour but d'effectuer ces opérations au cours d'une seule itération de la collection plutôt que d'itérer n fois la collection par opération.

Java 8 voulait tirer partie du multi coeur afin de faciliter la parrallélisation de certains traitements. Il fallait donc s'attaquer à l'API la plus utilisée du monde Java, les collections. Jose nous explique qu' avec l'évolution des technologies, il semble que le pattern Iterator (d'où dérive les Collections) devienne obsolète. C'est pour ces raisons, que la notion de stream a été créée. Cette notion permet de regrouper un ensemble d'opérations à traiter sur les données contenues au sein de la collection et cela de manière parrallèle (ex: une somme, un tri, etc.). La parrallélisation des opérations est possible tant que les opérations respectent la règle d'associativité (le calcul d'une somme est associative). Le speaker insiste sur le fait qu'un stream ne contient aucunes données tant que l'opération d'itération sur la collection n'est pas lancée.
Par ailleurs, cette nouvelle interface permet de décorer de nouvelles fonctionnalités que les développeurs ont toujours souhaité (filtre, map/reduce, etc.).

ATTENTION: un stream n'a pas le droit de modifier les valeurs contenu au sein de la collection !!

En conclusion, les collections au sein de Java 8 ont grandement évoluées à la plus grande joie des développeurs qui pourront désormais réalisés un tas d'opérations très simplement.

Mon avis personel: le relooking qu'a subit les Collections au sein de Java 8 était nécessaire. Cependant pour moi, la nouvelle api stream ne remplace pas le pattern Iterator mais le complète plutôt en permettant de réaliser désormais des opérations en parrallèles.

Lien de la présentation: http://blog.paumard.org/2014/04/16/java-8-streams-et-collectors/

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.