Java 8 Streams : Approche déclarative du traitement de données
L'API Stream (Java 8) ajoute une couche abstraite pour traiter les données de façon déclarative, comme SQL. Exemple SQL :
SELECT max(salary), employee_id, employee_name FROM Employee
Sans Stream : boucles, vérifications répétées, code parallèle complexe et propice aux erreurs. Stream : déclaratif, parallélisable automatiquement, pas de stockage intermédiaire.
Caractéristiques d'un Stream
- Séquence d'éléments : calculés à la demande, pas stockés.
- Source : Collections, Arrays, I/O.
- Opérations agrégées : filter, map, limit, reduce, find, match...
- Pipelining : la plupart opérations retournent un Stream (opérations intermédiaires).
collect()= opération terminale. - Itérations automatiques : internes, pas d'itération explicite.
Générer des Streams
Collection.stream() // séquentiel
Collection.parallelStream() // parallèle
Opérations principales
forEach — Itération
new Random().ints().limit(10).forEach(System.out::println);
map — Transformation
List<Integer> squares = numbers.stream()
.map(i -> i*i).distinct().collect(Collectors.toList());
filter — Filtrage
long count = strings.stream().filter(String::isEmpty).count();
limit — Limiter la taille
random.ints().limit(10).forEach(System.out::println);
sorted — Tri
random.ints().limit(10).sorted().forEach(System.out::println);
Traitement parallèle
long count = strings.parallelStream().filter(String::isEmpty).count();
Basculer séquentiel/parallèle en changeant stream() ↔ parallelStream().
Collectors — Agrégation
List<String> filtered = strings.stream()
.filter(s -> !s.isEmpty()).collect(Collectors.toList());
String merged = strings.stream()
.filter(s -> !s.isEmpty()).collect(Collectors.joining(", "));
Statistiques
IntSummaryStatistics stats = numbers.stream().mapToInt(x -> x).summaryStatistics();
System.out.println("Max: " + stats.getMax());
System.out.println("Min: " + stats.getMin());
System.out.println("Sum: " + stats.getSum());
System.out.println("Average: " + stats.getAverage());
Exemple complet comparatif Java 7 vs Java 8
(Voir code source complet dans l'article original — opérations : compter chaînes vides, longueur 3, filtrer, joindre, carrés distincts, stats, aléatoires, parallèle.)
Résultats clés
Java 7: Average = 9 (division entière)
Java 8: Average = 9.444... (double précis via IntSummaryStatistics)
L'API Stream transforme le traitement de collections en code expressif, composable et parallélisable.
Java
- Maîtriser les opérateurs Java : Types, syntaxe et exemples pratiques
- Commentaires Java : Types, utilisation et bonnes pratiques
- Maîtriser la boucle for améliorée en Java : Syntaxe, exemples et bonnes pratiques
- Maîtriser les chaînes de caractères en Java : Création, méthodes et bonnes pratiques
- Maîtriser les interfaces Java : concepts, implémentation et bonnes pratiques
- Maîtriser les classes internes anonymes en Java : définition, syntaxe et exemples pratiques
- Maîtriser le try-with-resources Java : gestion automatique des ressources expliquée
- Annotations Java expliquées : types, placement et exemples pratiques
- Assertions Java : guide pratique pour détecter les bugs et assurer la fiabilité du code