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

Java 8 - collections et stream
Java 8 - collections et streamJava 8 - collections et stream
Java 8 - collections et streamFranck SIMON
 
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
 
Introduction à React JS
Introduction à React JSIntroduction à React JS
Introduction à React JSAbdoulaye Dieng
 
Cours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategyCours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategyENSET, Université Hassan II Casablanca
 
Cours python avancé
Cours python avancéCours python avancé
Cours python avancépierrepo
 
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
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring bootAntoine Rey
 
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
 
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
 
Appels de procédures distants (RPC)
Appels de procédures distants (RPC)Appels de procédures distants (RPC)
Appels de procédures distants (RPC)Heithem Abbes
 

Tendances (20)

Servlets et JSP
Servlets et JSPServlets et JSP
Servlets et JSP
 
Java 8 - collections et stream
Java 8 - collections et streamJava 8 - collections et stream
Java 8 - collections et stream
 
Support JEE Spring Inversion de Controle IOC et Spring MVC
Support JEE Spring Inversion de Controle IOC et Spring MVCSupport JEE Spring Inversion de Controle IOC et Spring MVC
Support JEE Spring Inversion de Controle IOC et Spring MVC
 
Support de cours angular
Support de cours angularSupport de cours angular
Support de cours angular
 
Cours design pattern m youssfi partie 6 proxy
Cours design pattern m youssfi partie 6 proxyCours design pattern m youssfi partie 6 proxy
Cours design pattern m youssfi partie 6 proxy
 
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...
 
Support NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDBSupport NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDB
 
Introduction à React JS
Introduction à React JSIntroduction à React JS
Introduction à React JS
 
Cours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategyCours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategy
 
Support POO Java première partie
Support POO Java première partieSupport POO Java première partie
Support POO Java première partie
 
Cours python avancé
Cours python avancéCours python avancé
Cours python avancé
 
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
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring boot
 
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...
 
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 ...
 
Java RMI
Java RMIJava RMI
Java RMI
 
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 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
 
Appels de procédures distants (RPC)
Appels de procédures distants (RPC)Appels de procédures distants (RPC)
Appels de procédures distants (RPC)
 
Mise en oeuvre des framework de machines et deep learning v1
Mise en oeuvre des framework de machines et deep learning v1 Mise en oeuvre des framework de machines et deep learning v1
Mise en oeuvre des framework de machines et deep learning v1
 

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