SlideShare une entreprise Scribd logo
1  sur  29
Télécharger pour lire hors ligne
Java 8
Collections et Stream
antislashn.org Java 8 - collections et stream 2 / 29
Introduction
● Quelque soit le langage, l'utilisation des collections est
incontournable
● tableau, liste, map, pile, ...
● Permettent de regrouper des donnée et de les traiter
● liste des factures d'un client pour calculer la moyenne de
ses paiements
● les traitements sont effectués en Java
antislashn.org Java 8 - collections et stream 3 / 29
Introduction
● Une première approche du modèle de conception
d'un traitement pourrait-être comme en SQL
● rechercher
● grouper
● exemple
SELECT AVG(montant) FROM factures WHERE facture.fk=?
– le développeur n'a pas besoin de coder comment calculer la
moyenne des montants facturés pour un client
antislashn.org Java 8 - collections et stream 4 / 29
Introduction
● En java il n'y as pas (n'avait pas) de moyen autre que
de coder dans une boucle le traitement
● De plus : comment optimiser les traitements sur des
collections importantes
● comment répartir les traitements sur une collection sur les
processeurs multi-cœurs
– il existe des solutions : framework mutithreading
● cf Java 7 avec fork-join
– mais le codage de traitements parallèle peut être complexe et
difficile à mettre au point
antislashn.org Java 8 - collections et stream 5 / 29
Introduction
● Java 8 : nouvelle API appelée Stream
● traitement des données de manière déclarative
● utilisation possible des architectures multi-cœurs
– utilisation de parallelStream() au lien de stream()
● comme beaucoup d'autres, Stream utilise la librairie
Optional
antislashn.org Java 8 - collections et stream 6 / 29
Optional
● Objectifs :
● solution au NullPointerException
● initié dans Google Guava
● Optional est un container contenant ou non une
valeur
● isPresent() renvoie true si la valeur est présente
● get() renvoie la valeur
● plusieurs autre méthodes permettent de retourner ou
exécuter des traitements si la valeur n'est pas présente
antislashn.org Java 8 - collections et stream 7 / 29
Optional
● Exemples
Optional< String > nom = Optional.ofNullable( null );
System.out.println( "Nom présent? " + nom.isPresent() );
System.out.println( "Nom : " + nom.orElseGet( () -> "[none]" ) );
System.out.println( nom.map( s -> "Bonjour " + s + "!" ).orElse( "Bonjour inconnu !" ) );
Optional< String > nom = Optional.ofNullable("Gaston" );
System.out.println( "Nom présent? " + nom.isPresent() );
System.out.println( "Nom : " + nom.orElseGet( () -> "[none]" ) );
System.out.println( nom.map( s -> "Bonjour " + s + "!" ).orElse( "Bonjour inconnu !" ) );
antislashn.org Java 8 - collections et stream 8 / 29
Exemple
● Programmation classique en Java
//Recherche des tarifs pour la destination cible
Destination destination = null;
for(Destination d : destinations) {
if(d.getRegion().equals(destinationCible)) {
destination = d;
break;
}
}
// tri des dates de voyages par prix
Collections.sort(destination.getDatesVoyages(), new Comparator<DatesVoyage>() {
@Override
public int compare(DatesVoyage dv1, DatesVoyage dv2) {
return (int)(dv1.getPrixHT() - dv2.getPrixHT());
}
});
// extraction des identiants des dates de voyages
List<Double> identifiants = new ArrayList<>();
for(DatesVoyage dv : destination.getDatesVoyages()) {
identifiants.add(dv.getPrixHT());
}
antislashn.org Java 8 - collections et stream 9 / 29
Exemple
● Utilisation des Streams de Java 8
List<Integer> datesVoyageID = destinations.stream()
.filter(d -> d.getRegion().equals(destinationCible))
.flatMap(d -> d.getDatesVoyages().stream())
.sorted(Comparator.comparing(DatesVoyage::getPrixHT))
.map(DatesVoyage::getId)
.collect(Collectors.toList());
destinations
filter
prédicat
flatMap
fonction
datesVoyages
sorted
fonction fonction
collectmap
antislashn.org Java 8 - collections et stream 10 / 29
Principes de base
● Stream
● séquence d'éléments provenant d'une source et
supportant des opérations de regroupement
– séquence d'élément : un stream permet l'accès à un ensemble
de valeurs d'un type T
● le stream est l'interface d'accès aux éléments, pas la collection d'éléments
– source : le stream consomme les éléments provenant d'une
source
● collection, tableau, I/O
– opération de regroupement : à l'image de SQL, le stream fournit
des opérations de base
● filter, map, reduce, find, match, sorted, ...
antislashn.org Java 8 - collections et stream 11 / 29
Principes de base
● Les streams ont deux caractéristiques qui les
différencient des opérations sur les collections
● chaînage (pipelining) : beaucoup d'opérations sur les
streams retournent eux même un stream
– ce qui permet de chaîner les streams entre-eux
– permet un certains nombres d'optimisation
● mode lazy, court-circuit
● itération interne
– contrairement aux collections qui nécessitent une itération
explicite (externe), les streams effectuent les itérations de
manière cachée
antislashn.org Java 8 - collections et stream 12 / 29
Streams vs Collections
● Les collections gèrent des données
● Les streams gèrent des traitements
● La différence entre collections et stream est :
● quand les traitements sont-ils appliqués ?
antislashn.org Java 8 - collections et stream 13 / 29
Streams vs Collections
● L'utilisation d'une collection nécessite une itération
● Un stream utilise une itération interne
List<String> transactionIds = new ArrayList<>();
for(Transaction t: transactions){
transactionIds.add(t.getId());
}
List<Integer> transactionIds =
transactions.stream()
.map(Transaction::getId)
.collect(Collectors.toList());
antislashn.org Java 8 - collections et stream 14 / 29
Opérations sur les streams
● Deux catégories d'opérations
● opérations intermédiaires
– renvoient un stream
– elles peuvent être connectées les unes aux autres
● opérations terminales
– renvoient un résultat (ou void)
● Les opérations intermédiaires ne exécutées que si
une opération terminale est invoquée
● mode lazy
antislashn.org Java 8 - collections et stream 15 / 29
Opérations sur les streams
● Exemple
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
List<Integer> twoEvenSquares =
numbers.stream()
.filter(n -> {
System.out.println("filtering " + n);
return n % 2 == 0;
})
.map(n -> {
System.out.println("mapping " + n);
return n * n;
})
.limit(2)
.collect(toList());
filtering 1
filtering 2
mapping 2
filtering 3
filtering 4
mapping 4
court-circuit : une partie
du stream est traitée
les opérations filter et
map ont été regroupées
en un seul passage
antislashn.org Java 8 - collections et stream 16 / 29
Opérations sur les streams
Source
Array
Collection
IO Channel
...
Opérations
intermédiaires
filter
distinct
seek
...
Opérations
terminales
count
forEach
collect
...
stream stream
antislashn.org Java 8 - collections et stream 17 / 29
Opérations sur les streams
● Pour résumer, les streams nécessitent
● une source de données sur laquelle sera effectuée une
requête
● un chaînage d'opérations intermédiaires
● une opération terminale qui déclenche l'exécution de la
chaîne d'opérations intermédiaires
antislashn.org Java 8 - collections et stream 18 / 29
Opérations de filtrage
● filter(Predicate) : retourne un stream incluant
tous les éléments correspondant au prédicat
● distinct : retourne un stream avec des éléments
uniques
● implémentation de la méthode equals
● limit(n) : retourne un stream limité à la taille n
● skip(n) : retourne un stream dont les n premiers
éléments ne sont pas pris en compte
antislashn.org Java 8 - collections et stream 19 / 29
Opérations de recherche
● anyMatch(Predicate) : retourne vrai si un des
éléments du stream correspond au prédicat
● allMatch(Predicate) : retourne vrai si tous les
éléments du stream correspondent au prédicat
● noneMatch(Predicate) : retourne vrai si aucun
élément du stream ne correspond au prédicat
● findFirst(), findAny() : retourne un
Optional<T> sur le premier élément, ou un élément
quelconque
antislashn.org Java 8 - collections et stream 20 / 29
Opération de recherche
● findAny() findFirst()
● opérations court-circuit
● retournent Optional<T>
● sur des traitements parallèles, findFirst() retourne le
premier élément
– findAny() ne garanti pas le retour du premier élément
The behavior of this operation is explicitly nondeterministic; it is free to select any element in the stream. This is to
allow for maximal performance in parallel operations; the cost is that multiple invocations on the same source may not
return the same result. (If a stable result is desired, use findFirst() instead.)
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
numbers.stream()
.filter(t -> t>4)
.findAny()
.ifPresent(System.out::println);
sortie console :
5
antislashn.org Java 8 - collections et stream 21 / 29
Mapping
● Permet de transposer les éléments d'un stream dans
un autre stream
● une fonction permet de mapper chaque élément, en lui
appliquant une fonction, vers un nouvel élément
● retourne un stream
List<Integer> test = numbers.stream()
.filter(t -> t>4)
.map(t -> t*2) // multiplication par 2
.collect(toList());
antislashn.org Java 8 - collections et stream 22 / 29
Mapping
● T reduce(T identity, BinaryOperator<T> accumulator)
● permet de réduire le nombre d'éléments en appliquant une
fonction sur deux éléments consécutifs
● paramètres
– une valeur initiale
– une fonction combinant des éléments pour produire une
nouvelle valeur
int somme = numbers.stream()
.reduce(0,(a,b) -> (a+b)); // somme des éléments, 0 : valeur de départ
antislashn.org Java 8 - collections et stream 23 / 29
Streams numériques
● L'utilisation de la méthode reduce() sur les types
primitifs est coûteuses : nombreuses transformations
en objets
● int ↔ Integer, double ↔ Double, ...
● Il existe des streams spécialisés dans les
numériques
● IntStream, DoubleStream, LongStream
● Méthodes usuelles pour convertir un stream
générique vers un stream numérique :
● mapToInt, mapToDouble, mapToLong
antislashn.org Java 8 - collections et stream 24 / 29
Streams numériques
● Les stream numériques possèdent des fonctions
spécialisées
● sum(), summaryStatistics(), max(), min(), ...
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
IntSummaryStatistics iss = numbers.stream()
.mapToInt(Integer::intValue)
.summaryStatistics();
System.out.println("somme : "+iss.getSum());
System.out.println("min : "+iss.getMin());
System.out.println("max : "+iss.getMax());
System.out.println("moyenne : "+iss.getAverage());
antislashn.org Java 8 - collections et stream 25 / 29
Streams numériques
● D'autres fonctions utilitaires existent
● cf. javadoc
● Exemple : création d'un stream de nombres impairs
compris entre 10 et 30
IntStream intStream = IntStream.range(10, 30).filter(n -> n%2 == 1);
intStream.forEach(System.out::println);
antislashn.org Java 8 - collections et stream 26 / 29
Créer un stream
● Méthodes utilitaires
● Arrays.stream
● Stream.of(...)
● Files.lines
String fileName = "monopoly.txt";
long nbLines = Files.lines(Paths.get(fileName)).count();
System.out.println("Nombre de lignes : " +nbLines);
antislashn.org Java 8 - collections et stream 27 / 29
Créer un stream
● Création à partir de fonctions
● les éléments d'un stream sont créés à la demande
● Stream.iterate et Stream.generate permettent de
créer un stream à partir d'une fonction
Stream<Integer> ints = Stream.iterate(1, i->i+2);
ints.limit(10).forEach(System.out::println);
Stream<Double> doubles = Stream.generate(new Random()::nextDouble);
doubles.limit(10).forEach(System.out::println);
antislashn.org Java 8 - collections et stream 28 / 29
Résumé
● Stream → opération intermédiaire → opération terminale
opérations intermédiaires
filter()
map()
flatMap()
distinct()
sorted()
peek()
limit()
skip()
opérations terminales
forEach()
forEachOrdered()
toArray()
reduce()
collect()
min()
max()
count()
anyMatch()
allMatch()
noneMatch()
findFirst()
findAny()
antislashn.org Java 8 - collections et stream 29 / 29
Ressources
● https://docs.oracle.com/javase/8/docs/api/
● https://www.oracle.com/technetwork/articles/java/ma14-java-se-8-streams-2177646.html

Contenu connexe

Tendances

Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring bootAntoine Rey
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EEInes Ouaz
 
Les Streams de Java 8
Les Streams de Java 8Les Streams de Java 8
Les Streams de Java 8Antoine Rey
 
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
 
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 Lambda Expressions.pptx
Java Lambda Expressions.pptxJava Lambda Expressions.pptx
Java Lambda Expressions.pptxSameerAhmed593310
 
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
 
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
 
Design Pattern introduction
Design Pattern introductionDesign Pattern introduction
Design Pattern introductionneuros
 
En route vers Java 21 - Javaday Paris 2023
En route vers Java 21 - Javaday Paris 2023En route vers Java 21 - Javaday Paris 2023
En route vers Java 21 - Javaday Paris 2023Jean-Michel Doudoux
 
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Jean-Michel Doudoux
 
Architecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesArchitecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesENSET, Université Hassan II Casablanca
 

Tendances (20)

Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring boot
 
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
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EE
 
Les Streams de Java 8
Les Streams de Java 8Les Streams de Java 8
Les Streams de Java 8
 
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 ...
 
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)
 
Sécurité des Applications Web avec Json Web Token (JWT)
Sécurité des Applications Web avec Json Web Token (JWT)Sécurité des Applications Web avec Json Web Token (JWT)
Sécurité des Applications Web avec Json Web Token (JWT)
 
Support Java Avancé Troisième Partie
Support Java Avancé Troisième PartieSupport Java Avancé Troisième Partie
Support Java Avancé Troisième Partie
 
Java Lambda Expressions.pptx
Java Lambda Expressions.pptxJava Lambda Expressions.pptx
Java Lambda Expressions.pptx
 
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
 
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
 
Design Pattern introduction
Design Pattern introductionDesign Pattern introduction
Design Pattern introduction
 
Site JEE de ECommerce Basé sur Spring IOC MVC Security JPA Hibernate
Site JEE de ECommerce  Basé sur Spring IOC MVC Security JPA HibernateSite JEE de ECommerce  Basé sur Spring IOC MVC Security JPA Hibernate
Site JEE de ECommerce Basé sur Spring IOC MVC Security JPA Hibernate
 
En route vers Java 21 - Javaday Paris 2023
En route vers Java 21 - Javaday Paris 2023En route vers Java 21 - Javaday Paris 2023
En route vers Java 21 - Javaday Paris 2023
 
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
 
Java 8 Lambda Expressions
Java 8 Lambda ExpressionsJava 8 Lambda Expressions
Java 8 Lambda Expressions
 
Les collections en Java
Les collections en JavaLes collections en Java
Les collections en Java
 
spring-boot-fr.pdf
spring-boot-fr.pdfspring-boot-fr.pdf
spring-boot-fr.pdf
 
Architecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesArchitecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependances
 
Support de cours Spring M.youssfi
Support de cours Spring  M.youssfiSupport de cours Spring  M.youssfi
Support de cours Spring M.youssfi
 

Similaire à Java 8 - collections et stream

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
 
Exploiter php 5
Exploiter php 5Exploiter php 5
Exploiter php 5halleck45
 
WS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaWS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaOlivier BAZOUD
 
L'API Collector dans tous ses états
L'API Collector dans tous ses étatsL'API Collector dans tous ses états
L'API Collector dans tous ses étatsJosé Paumard
 
Java1_BasesLangage.pdf
Java1_BasesLangage.pdfJava1_BasesLangage.pdf
Java1_BasesLangage.pdfLarbaSAWADOGO2
 
Java1_BasesLangage.pdf
Java1_BasesLangage.pdfJava1_BasesLangage.pdf
Java1_BasesLangage.pdfLarbaSAWADOGO2
 
BackDay Xebia : Découvrez RxJava, le reactive programming
BackDay Xebia : Découvrez RxJava, le reactive programmingBackDay Xebia : Découvrez RxJava, le reactive programming
BackDay Xebia : Découvrez RxJava, le reactive programmingPublicis Sapient Engineering
 
Chap2: lescollections
Chap2: lescollections Chap2: lescollections
Chap2: lescollections Sana REFAI
 
Distributed computing with Spark 2.x
Distributed computing with Spark 2.xDistributed computing with Spark 2.x
Distributed computing with Spark 2.xDr Hajji Hicham
 
Data Mining (Partie 2).pdf
Data Mining (Partie 2).pdfData Mining (Partie 2).pdf
Data Mining (Partie 2).pdfOuailChoukhairi
 
Marzouk une introduction à jdbc
Marzouk une introduction à jdbcMarzouk une introduction à jdbc
Marzouk une introduction à jdbcabderrahim marzouk
 

Similaire à Java 8 - collections et stream (20)

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...
 
algo-imsi-2.pdf
algo-imsi-2.pdfalgo-imsi-2.pdf
algo-imsi-2.pdf
 
Introduction à Python
Introduction à PythonIntroduction à Python
Introduction à Python
 
Exploiter php 5
Exploiter php 5Exploiter php 5
Exploiter php 5
 
Spark - Ippevent 19-02-2015
Spark - Ippevent 19-02-2015Spark - Ippevent 19-02-2015
Spark - Ippevent 19-02-2015
 
WS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaWS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - Xebia
 
JAVA, JDBC et liaison base de données
JAVA, JDBC et liaison base de donnéesJAVA, JDBC et liaison base de données
JAVA, JDBC et liaison base de données
 
Nouveautés de java 8
Nouveautés de java 8Nouveautés de java 8
Nouveautés de java 8
 
L'API Collector dans tous ses états
L'API Collector dans tous ses étatsL'API Collector dans tous ses états
L'API Collector dans tous ses états
 
Java1_BasesLangage.pdf
Java1_BasesLangage.pdfJava1_BasesLangage.pdf
Java1_BasesLangage.pdf
 
Java1_BasesLangage.pdf
Java1_BasesLangage.pdfJava1_BasesLangage.pdf
Java1_BasesLangage.pdf
 
Java collection
Java collection Java collection
Java collection
 
BackDay Xebia : Découvrez RxJava, le reactive programming
BackDay Xebia : Découvrez RxJava, le reactive programmingBackDay Xebia : Découvrez RxJava, le reactive programming
BackDay Xebia : Découvrez RxJava, le reactive programming
 
Chap2: lescollections
Chap2: lescollections Chap2: lescollections
Chap2: lescollections
 
Distributed computing with Spark 2.x
Distributed computing with Spark 2.xDistributed computing with Spark 2.x
Distributed computing with Spark 2.x
 
Event-sourcing avancé avec Scala
Event-sourcing avancé avec ScalaEvent-sourcing avancé avec Scala
Event-sourcing avancé avec Scala
 
Data Mining (Partie 2).pdf
Data Mining (Partie 2).pdfData Mining (Partie 2).pdf
Data Mining (Partie 2).pdf
 
threads.pdf
threads.pdfthreads.pdf
threads.pdf
 
Marzouk une introduction à jdbc
Marzouk une introduction à jdbcMarzouk une introduction à jdbc
Marzouk une introduction à jdbc
 
Part1
Part1Part1
Part1
 

Plus de Franck SIMON

Distribuer une librairie via maven
Distribuer une librairie via mavenDistribuer une librairie via maven
Distribuer une librairie via mavenFranck SIMON
 
Gwt jetty et sources de données
Gwt   jetty et sources de donnéesGwt   jetty et sources de données
Gwt jetty et sources de donnéesFranck SIMON
 
Description d'un fichier de prélèvements SEPA minimum
Description d'un fichier de prélèvements SEPA minimumDescription d'un fichier de prélèvements SEPA minimum
Description d'un fichier de prélèvements SEPA minimumFranck SIMON
 
Tomcat and apache httpd training
Tomcat and apache httpd trainingTomcat and apache httpd training
Tomcat and apache httpd trainingFranck SIMON
 
JBoss - chapitre JMX
JBoss - chapitre JMXJBoss - chapitre JMX
JBoss - chapitre JMXFranck SIMON
 
Java - programmation concurrente
Java - programmation concurrenteJava - programmation concurrente
Java - programmation concurrenteFranck SIMON
 
Android Input Method Editor
Android   Input Method EditorAndroid   Input Method Editor
Android Input Method EditorFranck SIMON
 
Architectures distribuées
Architectures distribuéesArchitectures distribuées
Architectures distribuéesFranck SIMON
 
Développement Android
Développement AndroidDéveloppement Android
Développement AndroidFranck SIMON
 
Java scripting api
Java scripting apiJava scripting api
Java scripting apiFranck SIMON
 

Plus de Franck SIMON (17)

Distribuer une librairie via maven
Distribuer une librairie via mavenDistribuer une librairie via maven
Distribuer une librairie via maven
 
Java 9 modules
Java 9    modulesJava 9    modules
Java 9 modules
 
Java 8 - lambda
Java 8 - lambdaJava 8 - lambda
Java 8 - lambda
 
Java 8 - DateTime
Java 8 - DateTimeJava 8 - DateTime
Java 8 - DateTime
 
Gwt jetty et sources de données
Gwt   jetty et sources de donnéesGwt   jetty et sources de données
Gwt jetty et sources de données
 
Description d'un fichier de prélèvements SEPA minimum
Description d'un fichier de prélèvements SEPA minimumDescription d'un fichier de prélèvements SEPA minimum
Description d'un fichier de prélèvements SEPA minimum
 
Tomcat and apache httpd training
Tomcat and apache httpd trainingTomcat and apache httpd training
Tomcat and apache httpd training
 
Android ORMLite
Android   ORMLiteAndroid   ORMLite
Android ORMLite
 
JBoss - chapitre JMX
JBoss - chapitre JMXJBoss - chapitre JMX
JBoss - chapitre JMX
 
Java - programmation concurrente
Java - programmation concurrenteJava - programmation concurrente
Java - programmation concurrente
 
Android Input Method Editor
Android   Input Method EditorAndroid   Input Method Editor
Android Input Method Editor
 
Squid
SquidSquid
Squid
 
Architectures distribuées
Architectures distribuéesArchitectures distribuées
Architectures distribuées
 
Android NDK
Android   NDKAndroid   NDK
Android NDK
 
Développement Android
Développement AndroidDéveloppement Android
Développement Android
 
jQuery
jQueryjQuery
jQuery
 
Java scripting api
Java scripting apiJava scripting api
Java scripting api
 

Dernier

Cours SE Le système Linux : La ligne de commande bash - IG IPSET
Cours SE Le système Linux : La ligne de commande bash - IG IPSETCours SE Le système Linux : La ligne de commande bash - IG IPSET
Cours SE Le système Linux : La ligne de commande bash - IG IPSETMedBechir
 
Le Lean sur une ligne de production : Formation et mise en application directe
Le Lean sur une ligne de production : Formation et mise en application directeLe Lean sur une ligne de production : Formation et mise en application directe
Le Lean sur une ligne de production : Formation et mise en application directeXL Groupe
 
Presentation de la plateforme Moodle - avril 2024
Presentation de la plateforme Moodle - avril 2024Presentation de la plateforme Moodle - avril 2024
Presentation de la plateforme Moodle - avril 2024Gilles Le Page
 
Annie Ernaux Extérieurs. pptx. Exposition basée sur un livre .
Annie   Ernaux  Extérieurs. pptx. Exposition basée sur un livre .Annie   Ernaux  Extérieurs. pptx. Exposition basée sur un livre .
Annie Ernaux Extérieurs. pptx. Exposition basée sur un livre .Txaruka
 
Présentation_ Didactique 1_SVT (S4) complet.pptx
Présentation_ Didactique 1_SVT (S4) complet.pptxPrésentation_ Didactique 1_SVT (S4) complet.pptx
Présentation_ Didactique 1_SVT (S4) complet.pptxrababouerdighi
 
Formation M2i - Comprendre les neurosciences pour développer son leadership
Formation M2i - Comprendre les neurosciences pour développer son leadershipFormation M2i - Comprendre les neurosciences pour développer son leadership
Formation M2i - Comprendre les neurosciences pour développer son leadershipM2i Formation
 
Principe de fonctionnement d'un moteur 4 temps
Principe de fonctionnement d'un moteur 4 tempsPrincipe de fonctionnement d'un moteur 4 temps
Principe de fonctionnement d'un moteur 4 tempsRajiAbdelghani
 
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdfSKennel
 
systeme expert_systeme expert_systeme expert
systeme expert_systeme expert_systeme expertsysteme expert_systeme expert_systeme expert
systeme expert_systeme expert_systeme expertChristianMbip
 
BONNES PRATIQUES DE FABRICATION RESUME SIMPLIFIE
BONNES PRATIQUES DE FABRICATION RESUME SIMPLIFIEBONNES PRATIQUES DE FABRICATION RESUME SIMPLIFIE
BONNES PRATIQUES DE FABRICATION RESUME SIMPLIFIEgharebikram98
 
Saint Georges, martyr, et la lègend du dragon.pptx
Saint Georges, martyr, et la lègend du dragon.pptxSaint Georges, martyr, et la lègend du dragon.pptx
Saint Georges, martyr, et la lègend du dragon.pptxMartin M Flynn
 
SciencesPo_Aix_InnovationPédagogique_Bilan.pdf
SciencesPo_Aix_InnovationPédagogique_Bilan.pdfSciencesPo_Aix_InnovationPédagogique_Bilan.pdf
SciencesPo_Aix_InnovationPédagogique_Bilan.pdfSKennel
 
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdfSKennel
 
SciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdf
SciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdfSciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdf
SciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdfSKennel
 
Fondation Louis Vuitton. pptx
Fondation      Louis      Vuitton.   pptxFondation      Louis      Vuitton.   pptx
Fondation Louis Vuitton. pptxTxaruka
 
Evaluation du systeme d'Education. Marocpptx
Evaluation du systeme d'Education. MarocpptxEvaluation du systeme d'Education. Marocpptx
Evaluation du systeme d'Education. MarocpptxAsmaa105193
 
le present des verbes reguliers -er.pptx
le present des verbes reguliers -er.pptxle present des verbes reguliers -er.pptx
le present des verbes reguliers -er.pptxmmatar2
 
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdfSKennel
 

Dernier (20)

DO PALÁCIO À ASSEMBLEIA .
DO PALÁCIO À ASSEMBLEIA                 .DO PALÁCIO À ASSEMBLEIA                 .
DO PALÁCIO À ASSEMBLEIA .
 
Cours SE Le système Linux : La ligne de commande bash - IG IPSET
Cours SE Le système Linux : La ligne de commande bash - IG IPSETCours SE Le système Linux : La ligne de commande bash - IG IPSET
Cours SE Le système Linux : La ligne de commande bash - IG IPSET
 
Le Lean sur une ligne de production : Formation et mise en application directe
Le Lean sur une ligne de production : Formation et mise en application directeLe Lean sur une ligne de production : Formation et mise en application directe
Le Lean sur une ligne de production : Formation et mise en application directe
 
Presentation de la plateforme Moodle - avril 2024
Presentation de la plateforme Moodle - avril 2024Presentation de la plateforme Moodle - avril 2024
Presentation de la plateforme Moodle - avril 2024
 
Annie Ernaux Extérieurs. pptx. Exposition basée sur un livre .
Annie   Ernaux  Extérieurs. pptx. Exposition basée sur un livre .Annie   Ernaux  Extérieurs. pptx. Exposition basée sur un livre .
Annie Ernaux Extérieurs. pptx. Exposition basée sur un livre .
 
Présentation_ Didactique 1_SVT (S4) complet.pptx
Présentation_ Didactique 1_SVT (S4) complet.pptxPrésentation_ Didactique 1_SVT (S4) complet.pptx
Présentation_ Didactique 1_SVT (S4) complet.pptx
 
Pâques de Sainte Marie-Euphrasie Pelletier
Pâques de Sainte Marie-Euphrasie PelletierPâques de Sainte Marie-Euphrasie Pelletier
Pâques de Sainte Marie-Euphrasie Pelletier
 
Formation M2i - Comprendre les neurosciences pour développer son leadership
Formation M2i - Comprendre les neurosciences pour développer son leadershipFormation M2i - Comprendre les neurosciences pour développer son leadership
Formation M2i - Comprendre les neurosciences pour développer son leadership
 
Principe de fonctionnement d'un moteur 4 temps
Principe de fonctionnement d'un moteur 4 tempsPrincipe de fonctionnement d'un moteur 4 temps
Principe de fonctionnement d'un moteur 4 temps
 
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdf
 
systeme expert_systeme expert_systeme expert
systeme expert_systeme expert_systeme expertsysteme expert_systeme expert_systeme expert
systeme expert_systeme expert_systeme expert
 
BONNES PRATIQUES DE FABRICATION RESUME SIMPLIFIE
BONNES PRATIQUES DE FABRICATION RESUME SIMPLIFIEBONNES PRATIQUES DE FABRICATION RESUME SIMPLIFIE
BONNES PRATIQUES DE FABRICATION RESUME SIMPLIFIE
 
Saint Georges, martyr, et la lègend du dragon.pptx
Saint Georges, martyr, et la lègend du dragon.pptxSaint Georges, martyr, et la lègend du dragon.pptx
Saint Georges, martyr, et la lègend du dragon.pptx
 
SciencesPo_Aix_InnovationPédagogique_Bilan.pdf
SciencesPo_Aix_InnovationPédagogique_Bilan.pdfSciencesPo_Aix_InnovationPédagogique_Bilan.pdf
SciencesPo_Aix_InnovationPédagogique_Bilan.pdf
 
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdf
 
SciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdf
SciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdfSciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdf
SciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdf
 
Fondation Louis Vuitton. pptx
Fondation      Louis      Vuitton.   pptxFondation      Louis      Vuitton.   pptx
Fondation Louis Vuitton. pptx
 
Evaluation du systeme d'Education. Marocpptx
Evaluation du systeme d'Education. MarocpptxEvaluation du systeme d'Education. Marocpptx
Evaluation du systeme d'Education. Marocpptx
 
le present des verbes reguliers -er.pptx
le present des verbes reguliers -er.pptxle present des verbes reguliers -er.pptx
le present des verbes reguliers -er.pptx
 
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdf
 

Java 8 - collections et stream

  • 2. antislashn.org Java 8 - collections et stream 2 / 29 Introduction ● Quelque soit le langage, l'utilisation des collections est incontournable ● tableau, liste, map, pile, ... ● Permettent de regrouper des donnée et de les traiter ● liste des factures d'un client pour calculer la moyenne de ses paiements ● les traitements sont effectués en Java
  • 3. antislashn.org Java 8 - collections et stream 3 / 29 Introduction ● Une première approche du modèle de conception d'un traitement pourrait-être comme en SQL ● rechercher ● grouper ● exemple SELECT AVG(montant) FROM factures WHERE facture.fk=? – le développeur n'a pas besoin de coder comment calculer la moyenne des montants facturés pour un client
  • 4. antislashn.org Java 8 - collections et stream 4 / 29 Introduction ● En java il n'y as pas (n'avait pas) de moyen autre que de coder dans une boucle le traitement ● De plus : comment optimiser les traitements sur des collections importantes ● comment répartir les traitements sur une collection sur les processeurs multi-cœurs – il existe des solutions : framework mutithreading ● cf Java 7 avec fork-join – mais le codage de traitements parallèle peut être complexe et difficile à mettre au point
  • 5. antislashn.org Java 8 - collections et stream 5 / 29 Introduction ● Java 8 : nouvelle API appelée Stream ● traitement des données de manière déclarative ● utilisation possible des architectures multi-cœurs – utilisation de parallelStream() au lien de stream() ● comme beaucoup d'autres, Stream utilise la librairie Optional
  • 6. antislashn.org Java 8 - collections et stream 6 / 29 Optional ● Objectifs : ● solution au NullPointerException ● initié dans Google Guava ● Optional est un container contenant ou non une valeur ● isPresent() renvoie true si la valeur est présente ● get() renvoie la valeur ● plusieurs autre méthodes permettent de retourner ou exécuter des traitements si la valeur n'est pas présente
  • 7. antislashn.org Java 8 - collections et stream 7 / 29 Optional ● Exemples Optional< String > nom = Optional.ofNullable( null ); System.out.println( "Nom présent? " + nom.isPresent() ); System.out.println( "Nom : " + nom.orElseGet( () -> "[none]" ) ); System.out.println( nom.map( s -> "Bonjour " + s + "!" ).orElse( "Bonjour inconnu !" ) ); Optional< String > nom = Optional.ofNullable("Gaston" ); System.out.println( "Nom présent? " + nom.isPresent() ); System.out.println( "Nom : " + nom.orElseGet( () -> "[none]" ) ); System.out.println( nom.map( s -> "Bonjour " + s + "!" ).orElse( "Bonjour inconnu !" ) );
  • 8. antislashn.org Java 8 - collections et stream 8 / 29 Exemple ● Programmation classique en Java //Recherche des tarifs pour la destination cible Destination destination = null; for(Destination d : destinations) { if(d.getRegion().equals(destinationCible)) { destination = d; break; } } // tri des dates de voyages par prix Collections.sort(destination.getDatesVoyages(), new Comparator<DatesVoyage>() { @Override public int compare(DatesVoyage dv1, DatesVoyage dv2) { return (int)(dv1.getPrixHT() - dv2.getPrixHT()); } }); // extraction des identiants des dates de voyages List<Double> identifiants = new ArrayList<>(); for(DatesVoyage dv : destination.getDatesVoyages()) { identifiants.add(dv.getPrixHT()); }
  • 9. antislashn.org Java 8 - collections et stream 9 / 29 Exemple ● Utilisation des Streams de Java 8 List<Integer> datesVoyageID = destinations.stream() .filter(d -> d.getRegion().equals(destinationCible)) .flatMap(d -> d.getDatesVoyages().stream()) .sorted(Comparator.comparing(DatesVoyage::getPrixHT)) .map(DatesVoyage::getId) .collect(Collectors.toList()); destinations filter prédicat flatMap fonction datesVoyages sorted fonction fonction collectmap
  • 10. antislashn.org Java 8 - collections et stream 10 / 29 Principes de base ● Stream ● séquence d'éléments provenant d'une source et supportant des opérations de regroupement – séquence d'élément : un stream permet l'accès à un ensemble de valeurs d'un type T ● le stream est l'interface d'accès aux éléments, pas la collection d'éléments – source : le stream consomme les éléments provenant d'une source ● collection, tableau, I/O – opération de regroupement : à l'image de SQL, le stream fournit des opérations de base ● filter, map, reduce, find, match, sorted, ...
  • 11. antislashn.org Java 8 - collections et stream 11 / 29 Principes de base ● Les streams ont deux caractéristiques qui les différencient des opérations sur les collections ● chaînage (pipelining) : beaucoup d'opérations sur les streams retournent eux même un stream – ce qui permet de chaîner les streams entre-eux – permet un certains nombres d'optimisation ● mode lazy, court-circuit ● itération interne – contrairement aux collections qui nécessitent une itération explicite (externe), les streams effectuent les itérations de manière cachée
  • 12. antislashn.org Java 8 - collections et stream 12 / 29 Streams vs Collections ● Les collections gèrent des données ● Les streams gèrent des traitements ● La différence entre collections et stream est : ● quand les traitements sont-ils appliqués ?
  • 13. antislashn.org Java 8 - collections et stream 13 / 29 Streams vs Collections ● L'utilisation d'une collection nécessite une itération ● Un stream utilise une itération interne List<String> transactionIds = new ArrayList<>(); for(Transaction t: transactions){ transactionIds.add(t.getId()); } List<Integer> transactionIds = transactions.stream() .map(Transaction::getId) .collect(Collectors.toList());
  • 14. antislashn.org Java 8 - collections et stream 14 / 29 Opérations sur les streams ● Deux catégories d'opérations ● opérations intermédiaires – renvoient un stream – elles peuvent être connectées les unes aux autres ● opérations terminales – renvoient un résultat (ou void) ● Les opérations intermédiaires ne exécutées que si une opération terminale est invoquée ● mode lazy
  • 15. antislashn.org Java 8 - collections et stream 15 / 29 Opérations sur les streams ● Exemple List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8); List<Integer> twoEvenSquares = numbers.stream() .filter(n -> { System.out.println("filtering " + n); return n % 2 == 0; }) .map(n -> { System.out.println("mapping " + n); return n * n; }) .limit(2) .collect(toList()); filtering 1 filtering 2 mapping 2 filtering 3 filtering 4 mapping 4 court-circuit : une partie du stream est traitée les opérations filter et map ont été regroupées en un seul passage
  • 16. antislashn.org Java 8 - collections et stream 16 / 29 Opérations sur les streams Source Array Collection IO Channel ... Opérations intermédiaires filter distinct seek ... Opérations terminales count forEach collect ... stream stream
  • 17. antislashn.org Java 8 - collections et stream 17 / 29 Opérations sur les streams ● Pour résumer, les streams nécessitent ● une source de données sur laquelle sera effectuée une requête ● un chaînage d'opérations intermédiaires ● une opération terminale qui déclenche l'exécution de la chaîne d'opérations intermédiaires
  • 18. antislashn.org Java 8 - collections et stream 18 / 29 Opérations de filtrage ● filter(Predicate) : retourne un stream incluant tous les éléments correspondant au prédicat ● distinct : retourne un stream avec des éléments uniques ● implémentation de la méthode equals ● limit(n) : retourne un stream limité à la taille n ● skip(n) : retourne un stream dont les n premiers éléments ne sont pas pris en compte
  • 19. antislashn.org Java 8 - collections et stream 19 / 29 Opérations de recherche ● anyMatch(Predicate) : retourne vrai si un des éléments du stream correspond au prédicat ● allMatch(Predicate) : retourne vrai si tous les éléments du stream correspondent au prédicat ● noneMatch(Predicate) : retourne vrai si aucun élément du stream ne correspond au prédicat ● findFirst(), findAny() : retourne un Optional<T> sur le premier élément, ou un élément quelconque
  • 20. antislashn.org Java 8 - collections et stream 20 / 29 Opération de recherche ● findAny() findFirst() ● opérations court-circuit ● retournent Optional<T> ● sur des traitements parallèles, findFirst() retourne le premier élément – findAny() ne garanti pas le retour du premier élément The behavior of this operation is explicitly nondeterministic; it is free to select any element in the stream. This is to allow for maximal performance in parallel operations; the cost is that multiple invocations on the same source may not return the same result. (If a stable result is desired, use findFirst() instead.) List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8); numbers.stream() .filter(t -> t>4) .findAny() .ifPresent(System.out::println); sortie console : 5
  • 21. antislashn.org Java 8 - collections et stream 21 / 29 Mapping ● Permet de transposer les éléments d'un stream dans un autre stream ● une fonction permet de mapper chaque élément, en lui appliquant une fonction, vers un nouvel élément ● retourne un stream List<Integer> test = numbers.stream() .filter(t -> t>4) .map(t -> t*2) // multiplication par 2 .collect(toList());
  • 22. antislashn.org Java 8 - collections et stream 22 / 29 Mapping ● T reduce(T identity, BinaryOperator<T> accumulator) ● permet de réduire le nombre d'éléments en appliquant une fonction sur deux éléments consécutifs ● paramètres – une valeur initiale – une fonction combinant des éléments pour produire une nouvelle valeur int somme = numbers.stream() .reduce(0,(a,b) -> (a+b)); // somme des éléments, 0 : valeur de départ
  • 23. antislashn.org Java 8 - collections et stream 23 / 29 Streams numériques ● L'utilisation de la méthode reduce() sur les types primitifs est coûteuses : nombreuses transformations en objets ● int ↔ Integer, double ↔ Double, ... ● Il existe des streams spécialisés dans les numériques ● IntStream, DoubleStream, LongStream ● Méthodes usuelles pour convertir un stream générique vers un stream numérique : ● mapToInt, mapToDouble, mapToLong
  • 24. antislashn.org Java 8 - collections et stream 24 / 29 Streams numériques ● Les stream numériques possèdent des fonctions spécialisées ● sum(), summaryStatistics(), max(), min(), ... List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8); IntSummaryStatistics iss = numbers.stream() .mapToInt(Integer::intValue) .summaryStatistics(); System.out.println("somme : "+iss.getSum()); System.out.println("min : "+iss.getMin()); System.out.println("max : "+iss.getMax()); System.out.println("moyenne : "+iss.getAverage());
  • 25. antislashn.org Java 8 - collections et stream 25 / 29 Streams numériques ● D'autres fonctions utilitaires existent ● cf. javadoc ● Exemple : création d'un stream de nombres impairs compris entre 10 et 30 IntStream intStream = IntStream.range(10, 30).filter(n -> n%2 == 1); intStream.forEach(System.out::println);
  • 26. antislashn.org Java 8 - collections et stream 26 / 29 Créer un stream ● Méthodes utilitaires ● Arrays.stream ● Stream.of(...) ● Files.lines String fileName = "monopoly.txt"; long nbLines = Files.lines(Paths.get(fileName)).count(); System.out.println("Nombre de lignes : " +nbLines);
  • 27. antislashn.org Java 8 - collections et stream 27 / 29 Créer un stream ● Création à partir de fonctions ● les éléments d'un stream sont créés à la demande ● Stream.iterate et Stream.generate permettent de créer un stream à partir d'une fonction Stream<Integer> ints = Stream.iterate(1, i->i+2); ints.limit(10).forEach(System.out::println); Stream<Double> doubles = Stream.generate(new Random()::nextDouble); doubles.limit(10).forEach(System.out::println);
  • 28. antislashn.org Java 8 - collections et stream 28 / 29 Résumé ● Stream → opération intermédiaire → opération terminale opérations intermédiaires filter() map() flatMap() distinct() sorted() peek() limit() skip() opérations terminales forEach() forEachOrdered() toArray() reduce() collect() min() max() count() anyMatch() allMatch() noneMatch() findFirst() findAny()
  • 29. antislashn.org Java 8 - collections et stream 29 / 29 Ressources ● https://docs.oracle.com/javase/8/docs/api/ ● https://www.oracle.com/technetwork/articles/java/ma14-java-se-8-streams-2177646.html