SlideShare une entreprise Scribd logo
1  sur  11
Télécharger pour lire hors ligne
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

Chapitre 5 classes abstraites et interfaces
Chapitre 5  classes abstraites et interfacesChapitre 5  classes abstraites et interfaces
Chapitre 5 classes abstraites et interfacesAmir Souissi
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring bootAntoine Rey
 
Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Martin Latrille
 
Correction Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdfCorrection Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdfslimyaich3
 
Fascicule de tp atelier développement web
Fascicule de tp atelier développement webFascicule de tp atelier développement web
Fascicule de tp atelier développement webHouda TOUKABRI
 
softCours design pattern m youssfi partie 9 creation des objets abstract fact...
softCours design pattern m youssfi partie 9 creation des objets abstract fact...softCours design pattern m youssfi partie 9 creation des objets abstract fact...
softCours design pattern m youssfi partie 9 creation des objets abstract fact...ENSET, Université Hassan II Casablanca
 
Chapitre8: Collections et Enumerations En Java
Chapitre8: Collections et Enumerations En JavaChapitre8: Collections et Enumerations En Java
Chapitre8: Collections et Enumerations En JavaAziz Darouichi
 
Examen principal- php - correction
Examen principal- php - correctionExamen principal- php - correction
Examen principal- php - correctionInes Ouaz
 
Initiation à Express js
Initiation à Express jsInitiation à Express js
Initiation à Express jsAbdoulaye Dieng
 

Tendances (20)

Angular Avancé
Angular AvancéAngular Avancé
Angular Avancé
 
Introduction à Angular
Introduction à AngularIntroduction à Angular
Introduction à Angular
 
Cours java
Cours javaCours java
Cours java
 
Chapitre 5 classes abstraites et interfaces
Chapitre 5  classes abstraites et interfacesChapitre 5  classes abstraites et interfaces
Chapitre 5 classes abstraites et interfaces
 
Support Java Avancé Troisième Partie
Support Java Avancé Troisième PartieSupport Java Avancé Troisième Partie
Support Java Avancé Troisième Partie
 
Support POO Java Deuxième Partie
Support POO Java Deuxième PartieSupport POO Java Deuxième Partie
Support POO Java Deuxième Partie
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring boot
 
Support de cours angular
Support de cours angularSupport de cours angular
Support de cours angular
 
Support POO Java première partie
Support POO Java première partieSupport POO Java première partie
Support POO Java première partie
 
Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)
 
Correction Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdfCorrection Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdf
 
Spring security
Spring securitySpring security
Spring security
 
Polymorphisme, interface et classe abstraite
Polymorphisme, interface et classe abstraitePolymorphisme, interface et classe abstraite
Polymorphisme, interface et classe abstraite
 
Fascicule de tp atelier développement web
Fascicule de tp atelier développement webFascicule de tp atelier développement web
Fascicule de tp atelier développement web
 
Polymorphisme (cours, résumé)
Polymorphisme (cours, résumé)Polymorphisme (cours, résumé)
Polymorphisme (cours, résumé)
 
softCours design pattern m youssfi partie 9 creation des objets abstract fact...
softCours design pattern m youssfi partie 9 creation des objets abstract fact...softCours design pattern m youssfi partie 9 creation des objets abstract fact...
softCours design pattern m youssfi partie 9 creation des objets abstract fact...
 
Chapitre8: Collections et Enumerations En Java
Chapitre8: Collections et Enumerations En JavaChapitre8: Collections et Enumerations En Java
Chapitre8: Collections et Enumerations En Java
 
Nouveautés de java 8
Nouveautés de java 8Nouveautés de java 8
Nouveautés de java 8
 
Examen principal- php - correction
Examen principal- php - correctionExamen principal- php - correction
Examen principal- php - correction
 
Initiation à Express js
Initiation à Express jsInitiation à Express js
Initiation à Express js
 

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 (6)

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
 

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