Java fonctionnel - Streams
Apprendre les Streams Java avec map, filter, reduce, collectors, et des regles pratiques pour ne pas en abuser.
#java #functional #streams #collections
Pourquoi cette etape est importante
Les Streams permettent d'exprimer clairement les transformations de donnees, surtout pour le filtrage, l'agregation et le reporting. Bien utilises, ils reduisent le boilerplate. Mal utilises, ils degradent la lisibilite.
Modele mental d'un pipeline Stream
Un pipeline Stream a trois parties :
- Source (
List,Set, tableau, etc.) - Operations intermediaires (
filter,map,sorted) - Operation terminale (
collect,forEach,count,reduce)
List<String> names = List.of("alice", "bob", "anna");
List<String> result = names.stream()
.filter(n -> n.startsWith("a"))
.map(String::toUpperCase)
.toList();
System.out.println(result); // [ALICE, ANNA]
map, filter, reduce
filter: garde les elements correspondantsmap: transforme chaque elementreduce: combine les elements en un seul resultat
int total = List.of(10, 20, 30).stream()
.filter(n -> n >= 20)
.reduce(0, Integer::sum);
System.out.println(total); // 50
Collectors
Les collectors servent a construire le resultat final d'un pipeline.
Map<String, Long> countByRole = List.of("admin", "user", "admin").stream()
.collect(Collectors.groupingBy(r -> r, Collectors.counting()));
System.out.println(countByRole); // {admin=2, user=1}
Collectors utiles :
toList()/toSet()groupingBy(...)partitioningBy(...)joining(...)counting(),summingInt(...)
Eviter la sur-utilisation des Streams
Les Streams ne sont pas toujours le meilleur choix. Prefere des boucles quand :
- la logique est tres stateful
- plusieurs effets de bord sont necessaires
- debugger une longue chaine est plus difficile qu'une boucle claire
Erreurs frequentes
- effets de bord dans
map/filter - chaines trop longues avec intention peu claire
- streams dans des boucles chaudes sans mesure de performance
- croire que le parallel stream est toujours plus rapide
Regle pratique
Utilise les Streams pour des transformations declaratives. Utilise des boucles pour un controle de flux complexe et mutable.
A retenir
- Penser en pipeline : source -> transformation -> terminal
- Maitriser
map,filter,reduce,collect - Garder le code stream court et lisible
- Ne pas forcer les Streams quand une boucle est plus claire