21. Streams et l'API Stream en Java
L'API Stream en Java est une approche moderne et fonctionnelle du traitement des séquences d'éléments. Introduite dans Java 8, l'API Stream représente un changement majeur dans la manière dont les développeurs peuvent écrire du code concis et lisible pour manipuler des collections de données. Dans ce chapitre, nous explorerons la puissance de Streams, des concepts de base aux techniques avancées.
Présentation des flux
Les flux sont des abstractions qui vous permettent de traiter les éléments d'une collection de manière déclarative. Au lieu de parcourir explicitement une collection à l'aide de boucles, vous pouvez utiliser l'API Stream pour décrire ce que vous souhaitez faire avec ces éléments. L'API Stream prend en charge les opérations d'agrégation telles que le filtrage, la cartographie, la réduction et bien d'autres.
Création de flux
Vous pouvez créer un Stream de plusieurs manières. L'une des méthodes les plus courantes consiste à utiliser des collections, en appelant la méthode stream()
:
Stream
pour créer des flux de tableaux ou de valeurs spécifiques :
Opérations intermédiaires
Les opérations intermédiaires sont celles qui transforment un Stream en un autre Stream, telles que filter
, map
et sorted
. Ils sont paresseux, ce qui signifie qu’ils ne sont exécutés que lorsqu’une opération de terminal est invoquée.
- filtre : sélectionne les éléments qui répondent à un critère spécifique.
stream.filter(s -> s.startsWith("a")); - map : applique une fonction à chaque élément et renvoie un Stream avec les résultats.
stream.map(String::toUpperCase); - triés : trie les éléments selon l'ordre naturel ou un comparateur fourni.
stream.sorted(Comparator.naturalOrder());
Opérations sur les terminaux
Les opérations de terminal sont celles qui produisent un résultat ou un effet secondaire, tels que forEach
, collect
, reduce
et count
. Lorsqu'une opération de terminal est invoquée, le traitement Stream commence.
- forEach : exécute une action pour chaque élément du Stream.
stream.forEach(System.out::println); - collect : collecte les éléments Stream dans une collection ou un autre type de résultat.
Liste<Chaîne> collecté = stream.collect(Collectors.toList()); - réduire : combine les éléments Stream pour produire une valeur unique.
Facultatif<Chaîne> concaténé = stream.reduce(String::concat); - count : renvoie le nombre d'éléments dans le flux.
compte long = stream.count();
Flux parallèles
Les flux parallèles permettent d'exécuter des opérations en parallèle sur différents threads, ce qui peut conduire à de meilleures performances sur les systèmes multiprocesseurs. Pour créer un Stream parallèle, vous pouvez appeler la méthode parallelStream()
sur une collection ou la méthode parallel()
sur un Stream existant.
Considérations relatives aux performances
Lorsque vous utilisez Streams, il est important d’être conscient des implications en termes de performances. Les opérations telles que trié
et distinct
peuvent être coûteuses car elles nécessitent un traitement supplémentaire. De plus, l’utilisation de Parallel Streams ne garantit pas toujours une augmentation des performances et peut même s’avérer contre-productive si le coût de fractionnement et de fusion des tâches est supérieur au gain du traitement parallèle.
Bonnes pratiques
Lorsque vous travaillez avec Streams, il est essentiel de suivre quelques bonnes pratiques pour garder le code propre et efficace :
- Utilisez des méthodes de référence autant que possible pour améliorer la lisibilité.
- Évitez de modifier l'état des objets externes dans les opérations Stream.
- Préférez les opérations sans état telles que
map
etfilter
aux opérations avec état telles quesorted
. - Pensez à la lisibilité et à la maintenabilité du code plutôt qu'aux micro-optimisations.
Conclusion
L'API Stream en Java offre un moyen puissant et flexible de travailler avec des collections de données. Avec un large éventail d'opérations intermédiaires et terminales, Streams permet aux développeurs d'écrire du code plus expressif et concis. En comprenant et en appliquant correctement les concepts Streams, vous pouvez améliorer considérablement la qualité et les performances de votre code Java.