SlideShare une entreprise Scribd logo
1  sur  11
Les Streams Java 8
Des boucles java 7 aux Streams Java 8, par l’exemple
Exemple d’un filtre
 Soit une liste de clients
List<Client> clients = Arrays.asList(
new Client("Jean", "Dupont", 41),
new Client("Yves", "Durant", 36),
new Client("Yvan", "Lemeux", 15)
);
 En Java 7
for (Client client : clients) {
if (client.getNom().startsWith("D")) {
System.out.println(client);
}
}
 En Java 8
Client{nom='Dupont', prenom='Jean', age=41}
Client{nom='Durant', prenom='Yves', age=36}
 Besoin : afficher les clients dont le nom commence par la lettre « D »
clients.stream()
.filter(c -> c.getNom().startsWith("D"))
.forEach(System.out::println);
 Nouveau concept introduit dans Java 8
 Permet de traiter efficacement de grands comme de petits volumes de données
 Un Stream n’est pas une collection
 Ne stocke pas de données
 Ne viens pas polluer l’API Collection
 Techniquement,
 une interface :
 Et des méthodes : filter, map, reduce, sorted, count, collect, forEach …
Stream
public interface Stream<T> extends BaseStream<T, Stream<T>> {
Stream<Client> stream = clients.stream();
 Un stream est un pipeline d’opérations
 0 à N opération(s) intermédiaire(s)
 Retourne toujours un Stream (chaînage possible)
 Déclaratif : leur traitement n’est réalisé que lors de l’appel de l’opération terminale
 Stateful ou staless
 Exemple : filter, map
 1 opération terminale
 Optimise et exécute les opérations intermédiaires
 Consomme le Stream
 Exemple : count, forEach
Opérations intermédiaires et terminales
Map Reduce
 Besoin : « Avec la même liste de clients, on souhaite calculer l’âge moyen des clients majeurs »
 En Java 7
int nbClient = 0, ageSum = 0;
for (Client client : clients) {
if (client.getAge() >= 18) {
nbClient++;
ageSum += client.getAge();
}
}
Double average = (double) ageSum / nbClient;
System.out.println(average);
 En Java 8
OptionalDouble average = clients.stream()
.filter(c -> c.getAge() >= 18)
.mapToInt(Client::getAge)
.average();
System.out.println(average.getAsDouble());
Jean, Yves, Yvan
Source
Filtre
getAge() >= 18
Prédicat
38.5Map
getAge()Jean, Yves average41, 36
Fonction Opération
terminale
Recherche
 Besoin : « afficher le nom du 1er client majeur de la liste précédente »
 En Java 7  En Java 8
String nom = clients.stream()
.filter(c -> c.getAge() >= 18)
.findFirst()
.map(Client::getNom)
.orElse("aucun résultat");
System.out.println(nom);
// Stream<Client>
// Optional<Client>
// Optional<String>
String nom = null;
for (Client client : clients) {
if (client.getAge() >= 18) {
nom = client.getNom();
break;
}
}
String msg = nom != null
? nom : "aucun résultat";
System.out.println(msg);
 Optional : conteneur pour une valeur qui peut
être null
Réduction simple
 Besoin : « rechercher le client le plus âgé »
Client doyen = null;
for (Client client : clients) {
if (doyen == null) {
doyen = client;
} else {
doyen= doyen.getAge() > client.getAge()
? doyen : client;
}
}
if (doyen!=null) System.out.println(doyen);
 En Java 7  En Java 8
clients.stream()
.reduce((c1, c2) -> c1.getAge() > c2.getAge()
? c1 : c2)
.ifPresent(System.out::println);
 Une opération de réduction combine tous les
éléments d’un stream en un seul résultat
 L’opération average() du IntStream est une
réduction prête à l’emploi
Collecte
 Besoin : « récupérer une liste contenant le nom des clients »
 En Java 7
List<String> noms = new ArrayList<>();
for (Client client : clients) {
noms.add(client.getNom());
}
List<String> noms = clients.stream()
.map(Client::getNom)
.collect(Collectors.toList());
 En Java 8
 La méthode collect est une réduction mutable
 Elle accumule les éléments d’un stream dans un container
 La classe Collectors propose des implémentations prêtes à l’emploi de l’interface Collector :
 toList, toSet, toCollection, toMap
Regroupement
 Besoin : « regrouper les clients par la 1ière lettre de leur nom »
Map<Character, List<Client>>
map = new HashMap<>();
for (Client client : clients) {
char initiale = client.getNom().charAt(0);
List<Client> liste = map.get(initiale);
if (liste == null) {
liste = new ArrayList<>();
map.put(initiale, liste);
}
liste.add(client);
}
Map<Character, List<Client>> map = clients.stream()
.collect(Collectors.groupingBy(
c -> c.getNom().charAt(0)));
 En Java 7  En Java 8
Pour aller plus loin
 Parallélisation de stream avec la méthode parallelStream()
 Rôle du Spliterator dans la construction d’un Stream
 Changement des caractéristiques d’un Stream en fonction des opérations
 Différences entre les Stream stateful et stateless
 Calculs en une passe avec IntSummaryStatistics et DoubleSummaryStatistics
 Streams spécialisés pour les numériques: IntStream, LongStream et DoubleStream
 Les Streams infinis et les opérations stoppantes
 Les Streams Builder
 La mise à plat de Streams avec flatMap
 Le debuggage de Streams avec peek
 Et de nombreuses autres opérations : allMatch, anyMatch, noneMatch, count,
sorted, sum, concat, findAny, limit, skip, min, max
Références
 Université de 3h sur le thème de Java 8, de l’API Stream et des Collectors
 Java 8 Streams cheat sheet by RebelLabs
 API Stream – Une nouvelle façon de gérer les Collections en Java 8

Contenu connexe

Tendances

Chapitre8: Collections et Enumerations En Java
Chapitre8: Collections et Enumerations En JavaChapitre8: Collections et Enumerations En Java
Chapitre8: Collections et Enumerations En JavaAziz Darouichi
 
Chap 6 : classes et interfaces
Chap 6 : classes et interfacesChap 6 : classes et interfaces
Chap 6 : classes et interfacesAziz Darouichi
 
Chapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en JavaChapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en JavaAziz Darouichi
 
Correction Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdfCorrection Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdfslimyaich3
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EEInes Ouaz
 
POO Java Chapitre 6 Exceptions
POO Java  Chapitre 6 ExceptionsPOO Java  Chapitre 6 Exceptions
POO Java Chapitre 6 ExceptionsMouna Torjmen
 
Cours python avancé
Cours python avancéCours python avancé
Cours python avancépierrepo
 
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)Développement d'un site web jee de e commerce basé sur spring (m.youssfi)
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)ENSET, Université Hassan II Casablanca
 
Java version 11 - les 9 nouveautes
Java version 11 -  les 9 nouveautesJava version 11 -  les 9 nouveautes
Java version 11 - les 9 nouveautesAbdenour Bouateli
 
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...ENSET, Université Hassan II Casablanca
 
Exercice 1 java Héritage
Exercice 1 java HéritageExercice 1 java Héritage
Exercice 1 java HéritageNadaBenLatifa
 
Concevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootConcevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootDNG Consulting
 
POO Java Chapitre 1 Classe & Objet
POO Java Chapitre 1 Classe & ObjetPOO Java Chapitre 1 Classe & Objet
POO Java Chapitre 1 Classe & ObjetMouna Torjmen
 
Appalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSPAppalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSPYouness Boukouchi
 
POO Java Chapitre 4 Heritage et Polymorphisme
POO Java Chapitre 4 Heritage et PolymorphismePOO Java Chapitre 4 Heritage et Polymorphisme
POO Java Chapitre 4 Heritage et PolymorphismeMouna Torjmen
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring bootAntoine Rey
 

Tendances (20)

Chapitre8: Collections et Enumerations En Java
Chapitre8: Collections et Enumerations En JavaChapitre8: Collections et Enumerations En Java
Chapitre8: Collections et Enumerations En Java
 
Chap 6 : classes et interfaces
Chap 6 : classes et interfacesChap 6 : classes et interfaces
Chap 6 : classes et interfaces
 
Chapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en JavaChapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en Java
 
Correction Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdfCorrection Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdf
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EE
 
Cours JavaScript
Cours JavaScriptCours JavaScript
Cours JavaScript
 
POO Java Chapitre 6 Exceptions
POO Java  Chapitre 6 ExceptionsPOO Java  Chapitre 6 Exceptions
POO Java Chapitre 6 Exceptions
 
Cours python avancé
Cours python avancéCours python avancé
Cours python avancé
 
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)Développement d'un site web jee de e commerce basé sur spring (m.youssfi)
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)
 
Java version 11 - les 9 nouveautes
Java version 11 -  les 9 nouveautesJava version 11 -  les 9 nouveautes
Java version 11 - les 9 nouveautes
 
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
 
Exercice 1 java Héritage
Exercice 1 java HéritageExercice 1 java Héritage
Exercice 1 java Héritage
 
Concevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootConcevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring Boot
 
Support de cours Spring M.youssfi
Support de cours Spring  M.youssfiSupport de cours Spring  M.youssfi
Support de cours Spring M.youssfi
 
POO Java Chapitre 1 Classe & Objet
POO Java Chapitre 1 Classe & ObjetPOO Java Chapitre 1 Classe & Objet
POO Java Chapitre 1 Classe & Objet
 
Appalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSPAppalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSP
 
Servlets et JSP
Servlets et JSPServlets et JSP
Servlets et JSP
 
POO Java Chapitre 4 Heritage et Polymorphisme
POO Java Chapitre 4 Heritage et PolymorphismePOO Java Chapitre 4 Heritage et Polymorphisme
POO Java Chapitre 4 Heritage et Polymorphisme
 
Python avancé : Classe et objet
Python avancé : Classe et objetPython avancé : Classe et objet
Python avancé : Classe et objet
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring boot
 

Similaire à Les Streams de Java 8

Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Normandy JUG
 
Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications JavaAntoine Rey
 
Solution Linux 2009 - JavaScript
Solution Linux 2009 - JavaScriptSolution Linux 2009 - JavaScript
Solution Linux 2009 - JavaScriptRaphaël Semeteys
 
Projet base de donnée
Projet base de donnée Projet base de donnée
Projet base de donnée MakremArfaoui2
 
20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soat20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soatSOAT
 

Similaire à Les Streams de Java 8 (7)

Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
 
Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications Java
 
Solution Linux 2009 - JavaScript
Solution Linux 2009 - JavaScriptSolution Linux 2009 - JavaScript
Solution Linux 2009 - JavaScript
 
Projet base de donnée
Projet base de donnée Projet base de donnée
Projet base de donnée
 
Atelier18
Atelier18 Atelier18
Atelier18
 
20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soat20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soat
 
Corrige tp java
Corrige tp javaCorrige tp java
Corrige tp java
 

Plus de Antoine Rey

Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?Antoine Rey
 
Spring Framework Petclinic sample application
Spring Framework Petclinic sample applicationSpring Framework Petclinic sample application
Spring Framework Petclinic sample applicationAntoine Rey
 
Retours Devoxx France 2016
Retours Devoxx France 2016Retours Devoxx France 2016
Retours Devoxx France 2016Antoine Rey
 
Ces outils qui vous font gagner du temps
Ces outils qui vous font gagner du tempsCes outils qui vous font gagner du temps
Ces outils qui vous font gagner du tempsAntoine Rey
 
Tester unitairement une application java
Tester unitairement une application javaTester unitairement une application java
Tester unitairement une application javaAntoine Rey
 
Les dessous du framework spring
Les dessous du framework springLes dessous du framework spring
Les dessous du framework springAntoine Rey
 
Introduction à Angular JS
Introduction à Angular JSIntroduction à Angular JS
Introduction à Angular JSAntoine Rey
 
Workshop Spring - Session 5 - Spring Integration
Workshop Spring - Session 5 - Spring IntegrationWorkshop Spring - Session 5 - Spring Integration
Workshop Spring - Session 5 - Spring IntegrationAntoine Rey
 
Workshop Spring - Session 4 - Spring Batch
Workshop Spring -  Session 4 - Spring BatchWorkshop Spring -  Session 4 - Spring Batch
Workshop Spring - Session 4 - Spring BatchAntoine Rey
 
Workshop Spring 3 - Tests et techniques avancées du conteneur Spring
Workshop Spring  3 - Tests et techniques avancées du conteneur SpringWorkshop Spring  3 - Tests et techniques avancées du conteneur Spring
Workshop Spring 3 - Tests et techniques avancées du conteneur SpringAntoine Rey
 
Workshop Spring - Session 1 - L'offre Spring et les bases
Workshop Spring  - Session 1 - L'offre Spring et les basesWorkshop Spring  - Session 1 - L'offre Spring et les bases
Workshop Spring - Session 1 - L'offre Spring et les basesAntoine Rey
 

Plus de Antoine Rey (11)

Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?
 
Spring Framework Petclinic sample application
Spring Framework Petclinic sample applicationSpring Framework Petclinic sample application
Spring Framework Petclinic sample application
 
Retours Devoxx France 2016
Retours Devoxx France 2016Retours Devoxx France 2016
Retours Devoxx France 2016
 
Ces outils qui vous font gagner du temps
Ces outils qui vous font gagner du tempsCes outils qui vous font gagner du temps
Ces outils qui vous font gagner du temps
 
Tester unitairement une application java
Tester unitairement une application javaTester unitairement une application java
Tester unitairement une application java
 
Les dessous du framework spring
Les dessous du framework springLes dessous du framework spring
Les dessous du framework spring
 
Introduction à Angular JS
Introduction à Angular JSIntroduction à Angular JS
Introduction à Angular JS
 
Workshop Spring - Session 5 - Spring Integration
Workshop Spring - Session 5 - Spring IntegrationWorkshop Spring - Session 5 - Spring Integration
Workshop Spring - Session 5 - Spring Integration
 
Workshop Spring - Session 4 - Spring Batch
Workshop Spring -  Session 4 - Spring BatchWorkshop Spring -  Session 4 - Spring Batch
Workshop Spring - Session 4 - Spring Batch
 
Workshop Spring 3 - Tests et techniques avancées du conteneur Spring
Workshop Spring  3 - Tests et techniques avancées du conteneur SpringWorkshop Spring  3 - Tests et techniques avancées du conteneur Spring
Workshop Spring 3 - Tests et techniques avancées du conteneur Spring
 
Workshop Spring - Session 1 - L'offre Spring et les bases
Workshop Spring  - Session 1 - L'offre Spring et les basesWorkshop Spring  - Session 1 - L'offre Spring et les bases
Workshop Spring - Session 1 - L'offre Spring et les bases
 

Les Streams de Java 8

  • 1. Les Streams Java 8 Des boucles java 7 aux Streams Java 8, par l’exemple
  • 2. Exemple d’un filtre  Soit une liste de clients List<Client> clients = Arrays.asList( new Client("Jean", "Dupont", 41), new Client("Yves", "Durant", 36), new Client("Yvan", "Lemeux", 15) );  En Java 7 for (Client client : clients) { if (client.getNom().startsWith("D")) { System.out.println(client); } }  En Java 8 Client{nom='Dupont', prenom='Jean', age=41} Client{nom='Durant', prenom='Yves', age=36}  Besoin : afficher les clients dont le nom commence par la lettre « D » clients.stream() .filter(c -> c.getNom().startsWith("D")) .forEach(System.out::println);
  • 3.  Nouveau concept introduit dans Java 8  Permet de traiter efficacement de grands comme de petits volumes de données  Un Stream n’est pas une collection  Ne stocke pas de données  Ne viens pas polluer l’API Collection  Techniquement,  une interface :  Et des méthodes : filter, map, reduce, sorted, count, collect, forEach … Stream public interface Stream<T> extends BaseStream<T, Stream<T>> { Stream<Client> stream = clients.stream();
  • 4.  Un stream est un pipeline d’opérations  0 à N opération(s) intermédiaire(s)  Retourne toujours un Stream (chaînage possible)  Déclaratif : leur traitement n’est réalisé que lors de l’appel de l’opération terminale  Stateful ou staless  Exemple : filter, map  1 opération terminale  Optimise et exécute les opérations intermédiaires  Consomme le Stream  Exemple : count, forEach Opérations intermédiaires et terminales
  • 5. Map Reduce  Besoin : « Avec la même liste de clients, on souhaite calculer l’âge moyen des clients majeurs »  En Java 7 int nbClient = 0, ageSum = 0; for (Client client : clients) { if (client.getAge() >= 18) { nbClient++; ageSum += client.getAge(); } } Double average = (double) ageSum / nbClient; System.out.println(average);  En Java 8 OptionalDouble average = clients.stream() .filter(c -> c.getAge() >= 18) .mapToInt(Client::getAge) .average(); System.out.println(average.getAsDouble()); Jean, Yves, Yvan Source Filtre getAge() >= 18 Prédicat 38.5Map getAge()Jean, Yves average41, 36 Fonction Opération terminale
  • 6. Recherche  Besoin : « afficher le nom du 1er client majeur de la liste précédente »  En Java 7  En Java 8 String nom = clients.stream() .filter(c -> c.getAge() >= 18) .findFirst() .map(Client::getNom) .orElse("aucun résultat"); System.out.println(nom); // Stream<Client> // Optional<Client> // Optional<String> String nom = null; for (Client client : clients) { if (client.getAge() >= 18) { nom = client.getNom(); break; } } String msg = nom != null ? nom : "aucun résultat"; System.out.println(msg);  Optional : conteneur pour une valeur qui peut être null
  • 7. Réduction simple  Besoin : « rechercher le client le plus âgé » Client doyen = null; for (Client client : clients) { if (doyen == null) { doyen = client; } else { doyen= doyen.getAge() > client.getAge() ? doyen : client; } } if (doyen!=null) System.out.println(doyen);  En Java 7  En Java 8 clients.stream() .reduce((c1, c2) -> c1.getAge() > c2.getAge() ? c1 : c2) .ifPresent(System.out::println);  Une opération de réduction combine tous les éléments d’un stream en un seul résultat  L’opération average() du IntStream est une réduction prête à l’emploi
  • 8. Collecte  Besoin : « récupérer une liste contenant le nom des clients »  En Java 7 List<String> noms = new ArrayList<>(); for (Client client : clients) { noms.add(client.getNom()); } List<String> noms = clients.stream() .map(Client::getNom) .collect(Collectors.toList());  En Java 8  La méthode collect est une réduction mutable  Elle accumule les éléments d’un stream dans un container  La classe Collectors propose des implémentations prêtes à l’emploi de l’interface Collector :  toList, toSet, toCollection, toMap
  • 9. Regroupement  Besoin : « regrouper les clients par la 1ière lettre de leur nom » Map<Character, List<Client>> map = new HashMap<>(); for (Client client : clients) { char initiale = client.getNom().charAt(0); List<Client> liste = map.get(initiale); if (liste == null) { liste = new ArrayList<>(); map.put(initiale, liste); } liste.add(client); } Map<Character, List<Client>> map = clients.stream() .collect(Collectors.groupingBy( c -> c.getNom().charAt(0)));  En Java 7  En Java 8
  • 10. Pour aller plus loin  Parallélisation de stream avec la méthode parallelStream()  Rôle du Spliterator dans la construction d’un Stream  Changement des caractéristiques d’un Stream en fonction des opérations  Différences entre les Stream stateful et stateless  Calculs en une passe avec IntSummaryStatistics et DoubleSummaryStatistics  Streams spécialisés pour les numériques: IntStream, LongStream et DoubleStream  Les Streams infinis et les opérations stoppantes  Les Streams Builder  La mise à plat de Streams avec flatMap  Le debuggage de Streams avec peek  Et de nombreuses autres opérations : allMatch, anyMatch, noneMatch, count, sorted, sum, concat, findAny, limit, skip, min, max
  • 11. Références  Université de 3h sur le thème de Java 8, de l’API Stream et des Collectors  Java 8 Streams cheat sheet by RebelLabs  API Stream – Une nouvelle façon de gérer les Collections en Java 8

Notes de l'éditeur

  1. Efficacement = en parallèle et en pipeline Approche fonctionnelle Exploite les lambdas Un Stream ne doit pas modifier pas les données La méthode .stream() est une default method de l’interface Collection
  2. Pipeline assimilé aux | linux Stream consommé = stream non réutilisable Statefull : nécessite de connaître l’ensemble des éléments du stream pour calculer le résultat (ex: distinct)
  3. L’ accumulator BiFunction crée un nouveau résultat partiel à partir de deux résultats partiels Implémentation Java 8 alternative : clients.stream() .max((c1, c2) ->Integer.valueOf(c1.getAge()) .compareTo(c2.getAge())) .ifPresent(System.out::println);
  4. Caractéristiques d’un Stream : ORDERED, DISCTINCT, SIZED, SORTED … Exemples : Les méthodes filter et limit mettent SIZED à 0 La méthode distinct met DISTINCT à 1