Stream introduit dans Java 8 est un moyen puissant et flexible de traiter les collectes de données. Les flux fournissent un style de programmation déclaratif qui rend la manipulation des données plus concise et lisible. Voici quelques suggestions sur la façon d'utiliser correctement les flux dans Java 8 :
-
Créer un flux :
- Utilisez des méthodes
Collection
d'interfacestream()
pour créer des flux.
List<String> myList = Arrays.asList("apple", "banana", "orange"); Stream<String> myStream = myList.stream();
- Utilisez
Stream.of()
la méthode pour créer un flux contenant les éléments spécifiés.
Stream<String> myStream = Stream.of("apple", "banana", "orange");
- Utilisez des méthodes
-
Opérations intermédiaires :
- Les opérations intermédiaires sont des méthodes de conversion et de traitement de flux, telles que
filter
,map
,distinct
etc.
myList.stream() .filter(s -> s.startsWith("a")) .map(String::toUpperCase) .distinct() .forEach(System.out::println);
- Les opérations intermédiaires sont des méthodes de conversion et de traitement de flux, telles que
-
Fonctionnement des terminaux :
- Les opérations de terminal sont des méthodes permettant d'effectuer des opérations finales sur des flux, telles que
forEach
,collect
,reduce
etc.
myList.stream() .forEach(System.out::println); List<String> resultList = myList.stream() .filter(s -> s.length() > 5) .collect(Collectors.toList());
- Les opérations de terminal sont des méthodes permettant d'effectuer des opérations finales sur des flux, telles que
-
Évitez de modifier les données sources :
- Les flux sont immuables et chaque opération intermédiaire renvoie un nouveau flux. Évitez de modifier les données sources pour garantir l’immuabilité du flux.
List<String> modifiedList = myList.stream() .map(String::toUpperCase) .collect(Collectors.toList());
-
Utiliser une évaluation paresseuse :
- Les flux utilisent une évaluation paresseuse et les opérations intermédiaires ne sont effectuées que lorsque l'opération du terminal est appelée. Cette approche peut améliorer les performances.
myList.stream() .filter(s -> s.length() > 3) .map(String::toUpperCase);
-
Flux parallèles :
- Utilisez
parallelStream()
des méthodes pour convertir des flux en flux parallèles afin d'exploiter pleinement les performances des processeurs multicœurs.
myList.parallelStream() .filter(s -> s.startsWith("a")) .forEach(System.out::println);
- Utilisez
-
Collecteur personnalisé :
- Si le collecteur standard ne répond pas à vos besoins, vous pouvez
Collector
personnaliser le collecteur via l'interface.
List<String> resultList = myList.stream() .collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
- Si le collecteur standard ne répond pas à vos besoins, vous pouvez
-
Utilisation du type facultatif :
- Lors du processus d'utilisation des flux, vous pouvez l'utiliser
Optional
pour gérer d'éventuelles situations nulles et éviter les exceptions de pointeur nul.
Optional<String> result = myList.stream() .filter(s -> s.startsWith("a")) .findFirst();
- Lors du processus d'utilisation des flux, vous pouvez l'utiliser
-
Opération composée :
- Plusieurs opérations intermédiaires et terminales peuvent être combinées pour réaliser des opérations plus complexes.
long count = myList.stream() .filter(s -> s.length() > 3) .map(String::toUpperCase) .distinct() .count();
Ces suggestions peuvent vous aider à utiliser correctement les flux dans Java 8 et à tirer parti de leur simplicité et de leur puissance.