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

Appalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSPAppalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSPYouness Boukouchi
 
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
 
Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...
Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...
Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...ENSET, Université Hassan II Casablanca
 
Java entreprise edition et industrialisation du génie logiciel par m.youssfi
Java entreprise edition et industrialisation du génie logiciel par m.youssfiJava entreprise edition et industrialisation du génie logiciel par m.youssfi
Java entreprise edition et industrialisation du génie logiciel par m.youssfiENSET, Université Hassan II Casablanca
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring bootAntoine Rey
 
cours j2ee -présentation
cours  j2ee -présentationcours  j2ee -présentation
cours j2ee -présentationYassine Badri
 
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...ENSET, Université Hassan II Casablanca
 
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
 
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...ENSET, Université Hassan II Casablanca
 
Jsf 110530152515-phpapp01
Jsf 110530152515-phpapp01Jsf 110530152515-phpapp01
Jsf 110530152515-phpapp01Eric Bourdet
 

Tendances (20)

Support Web Services SOAP et RESTful Mr YOUSSFI
Support Web Services SOAP et RESTful Mr YOUSSFISupport Web Services SOAP et RESTful Mr YOUSSFI
Support Web Services SOAP et RESTful Mr YOUSSFI
 
Support de cours technologie et application m.youssfi
Support de cours technologie et application m.youssfiSupport de cours technologie et application m.youssfi
Support de cours technologie et application m.youssfi
 
Support de cours Spring M.youssfi
Support de cours Spring  M.youssfiSupport de cours Spring  M.youssfi
Support de cours Spring M.youssfi
 
Appalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSPAppalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSP
 
Support Java Avancé Troisième Partie
Support Java Avancé Troisième PartieSupport Java Avancé Troisième Partie
Support Java Avancé Troisième Partie
 
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 ...
 
Support de cours angular
Support de cours angularSupport de cours angular
Support de cours angular
 
Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...
Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...
Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...
 
Maven et industrialisation du logiciel
Maven et industrialisation du logicielMaven et industrialisation du logiciel
Maven et industrialisation du logiciel
 
Java entreprise edition et industrialisation du génie logiciel par m.youssfi
Java entreprise edition et industrialisation du génie logiciel par m.youssfiJava entreprise edition et industrialisation du génie logiciel par m.youssfi
Java entreprise edition et industrialisation du génie logiciel par m.youssfi
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring boot
 
Support NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDBSupport NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDB
 
Support JEE Servlet Jsp MVC M.Youssfi
Support JEE Servlet Jsp MVC M.YoussfiSupport JEE Servlet Jsp MVC M.Youssfi
Support JEE Servlet Jsp MVC M.Youssfi
 
Support POO Java première partie
Support POO Java première partieSupport POO Java première partie
Support POO Java première partie
 
cours j2ee -présentation
cours  j2ee -présentationcours  j2ee -présentation
cours j2ee -présentation
 
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
 
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
 
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...
 
Jsf 110530152515-phpapp01
Jsf 110530152515-phpapp01Jsf 110530152515-phpapp01
Jsf 110530152515-phpapp01
 
Support de cours entrepise java beans ejb m.youssfi
Support de cours entrepise java beans ejb m.youssfiSupport de cours entrepise java beans ejb m.youssfi
Support de cours entrepise java beans ejb m.youssfi
 

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