Leçons du module (2/2)
Stream API
Les Stream API en Java permettent de traiter des collections d'objets de manière déclarative, en tirant parti de la programmation fonctionnelle. Un Stream ne stocke pas de données, mais transporte les éléments d'une source (comme une liste ou un tableau) à travers un pipeline d'opérations.
Un pipeline de Stream se compose de trois parties :
- Une source (ex.
list.stream()) - Zéro ou plusieurs opérations intermédiaires (qui renvoient un nouveau Stream, ex.
filter,map) - Une opération terminale (qui produit un résultat final ou un effet secondaire et ferme le Stream, ex.
collect,forEach,reduce)
Opérations Intermédiaires Courantes
Les opérations intermédiaires sont "paresseuses" (lazy) : elles ne sont pas exécutées tant qu'une opération terminale n'est pas invoquée.
filter(Predicate): filtre les éléments en fonction d'une condition booléenne.map(Function): transforme chaque élément en un autre objet en appliquant une fonction.sorted(): trie les éléments du Stream.
List<String> names = Arrays.asList("Marco", "Anna", "Giovanni");
List<String> filtered = names.stream()
.filter(name -> name.startsWith("M"))
.map(name -> name.toUpperCase())
.collect(Collectors.toList()); // "MARCO"
Opérations Terminales Courantes
forEach(Consumer): exécute une action pour chaque élément du Stream.collect(Collector): recueille les résultats du Stream dans un conteneur (ex. une liste viaCollectors.toList()).reduce(identity, BinaryOperator): combine les éléments du Stream en une seule valeur cumulative.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream()
.reduce(0, (a, b) -> a + b); // Somma tutti i numeri: 10
À toi de jouer
Complétez le code en utilisant le Stream des ressources pour filtrer uniquement les nombres pairs, les recueillir dans une nouvelle List nommée evens et l'afficher avec System.out.println.
Afficher l'indice
Commencez par appeler `numbers.stream()`, ajoutez `.filter(n -> n % 2 == 0)` et enfin accumulez avec `.collect(Collectors.toList())`.
Solution disponible après 3 tentatives
Utilisez les Streams pour transformer tous les noms de la liste names en lettres majuscules à l'aide de map, et affichez-les à l'écran un par un en utilisant forEach avec System.lineSeparator ou une référence de méthode.
Afficher l'indice
Utilisez `.map(s -> s.toUpperCase())` suivi de l'opération terminale `.forEach(System.out::println)`.
Solution disponible après 3 tentatives
Complétez le code en calculant la somme de tous les nombres présents dans la liste numbers à l'aide d'un Stream et de l'opération terminale reduce avec une valeur initiale de 0. Affichez le résultat.
Afficher l'indice
Utilisez `numbers.stream().reduce(0, (a, b) -> a + b)` et affichez la variable contenant le résultat.
Solution disponible après 3 tentatives