Java 8 - collections et stream

Franck SIMON
Franck SIMONConsultant architecte logiciel Java EE et IoT (Internet des Objets) à Transtel
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
1 sur 29

Recommandé

Les Streams de Java 8 par
Les Streams de Java 8Les Streams de Java 8
Les Streams de Java 8Antoine Rey
14.6K vues11 diapositives
Interface fonctionnelle, Lambda expression, méthode par défaut, référence de... par
Interface fonctionnelle, Lambda expression, méthode par défaut,  référence de...Interface fonctionnelle, Lambda expression, méthode par défaut,  référence de...
Interface fonctionnelle, Lambda expression, méthode par défaut, référence de...MICHRAFY MUSTAFA
4.9K vues41 diapositives
Fondamentaux java par
Fondamentaux javaFondamentaux java
Fondamentaux javaInes Ouaz
3K vues117 diapositives
Formation JAVA/J2EE par
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EEInes Ouaz
8.7K vues44 diapositives
Mohamed youssfi support architectures logicielles distribuées basées sue les ... par
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
105.6K vues122 diapositives
Concevoir, développer et sécuriser des micro-services avec Spring Boot par
Concevoir, développer et sécuriser des micro-services avec Spring BootConcevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootDNG Consulting
2.7K vues24 diapositives

Contenu connexe

Tendances

Support POO Java première partie par
Support POO Java première partieSupport POO Java première partie
Support POO Java première partieENSET, Université Hassan II Casablanca
30.3K vues128 diapositives
Support distributed computing and caching avec hazelcast par
Support distributed computing and caching avec hazelcastSupport distributed computing and caching avec hazelcast
Support distributed computing and caching avec hazelcastENSET, Université Hassan II Casablanca
12.5K vues40 diapositives
Développement d'un site web jee de e commerce basé sur spring (m.youssfi) par
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
46.8K vues109 diapositives
Support programmation orientée aspect mohamed youssfi (aop) par
Support programmation orientée aspect mohamed youssfi (aop)Support programmation orientée aspect mohamed youssfi (aop)
Support programmation orientée aspect mohamed youssfi (aop)ENSET, Université Hassan II Casablanca
125.6K vues78 diapositives
Support de cours Spring M.youssfi par
Support de cours Spring  M.youssfiSupport de cours Spring  M.youssfi
Support de cours Spring M.youssfiENSET, Université Hassan II Casablanca
97.8K vues164 diapositives
Workshop spring session 2 - La persistance au sein des applications Java par
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
10.4K vues22 diapositives

Tendances(20)

Workshop spring session 2 - La persistance au sein des applications Java par Antoine Rey
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
Antoine Rey10.4K vues
Support du cours : Programmation Web 2 par Faycel Chaoua
Support du cours : Programmation Web 2Support du cours : Programmation Web 2
Support du cours : Programmation Web 2
Faycel Chaoua2.3K vues
Partie 2: Angular par Habib Ayad
Partie 2: AngularPartie 2: Angular
Partie 2: Angular
Habib Ayad163 vues
Chapitre 5 classes abstraites et interfaces par Amir Souissi
Chapitre 5  classes abstraites et interfacesChapitre 5  classes abstraites et interfaces
Chapitre 5 classes abstraites et interfaces
Amir Souissi2K vues

Similaire à Java 8 - collections et stream

Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f... par
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
1.8K vues153 diapositives
algo-imsi-2.pdf par
algo-imsi-2.pdfalgo-imsi-2.pdf
algo-imsi-2.pdfWafaa Ibrihich
2 vues25 diapositives
Exploiter php 5 par
Exploiter php 5Exploiter php 5
Exploiter php 5halleck45
3.6K vues43 diapositives
Spark - Ippevent 19-02-2015 par
Spark - Ippevent 19-02-2015Spark - Ippevent 19-02-2015
Spark - Ippevent 19-02-2015Alexis Seigneurin
4.2K vues37 diapositives
WS User Group - Spring Batch - Xebia par
WS User Group - Spring Batch - XebiaWS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaOlivier BAZOUD
1.9K vues73 diapositives
JAVA, JDBC et liaison base de données par
JAVA, JDBC et liaison base de donnéesJAVA, JDBC et liaison base de données
JAVA, JDBC et liaison base de donnéesJean David Olekhnovitch
9.2K vues51 diapositives

Similaire à Java 8 - collections et stream(20)

Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f... par Normandy JUG
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 JUG1.8K vues
Exploiter php 5 par halleck45
Exploiter php 5Exploiter php 5
Exploiter php 5
halleck453.6K vues
WS User Group - Spring Batch - Xebia par Olivier BAZOUD
WS User Group - Spring Batch - XebiaWS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - Xebia
Olivier BAZOUD1.9K vues
L'API Collector dans tous ses états par José Paumard
L'API Collector dans tous ses étatsL'API Collector dans tous ses états
L'API Collector dans tous ses états
José Paumard1.2K vues
Chap2: lescollections par Sana REFAI
Chap2: lescollections Chap2: lescollections
Chap2: lescollections
Sana REFAI98 vues

Plus de Franck SIMON

Distribuer une librairie via maven par
Distribuer une librairie via mavenDistribuer une librairie via maven
Distribuer une librairie via mavenFranck SIMON
619 vues15 diapositives
Java 9 modules par
Java 9    modulesJava 9    modules
Java 9 modulesFranck SIMON
532 vues19 diapositives
Java 8 - lambda par
Java 8 - lambdaJava 8 - lambda
Java 8 - lambdaFranck SIMON
611 vues20 diapositives
Java 8 - interfaces par
Java 8 - interfacesJava 8 - interfaces
Java 8 - interfacesFranck SIMON
458 vues34 diapositives
Java 8 - DateTime par
Java 8 - DateTimeJava 8 - DateTime
Java 8 - DateTimeFranck SIMON
500 vues15 diapositives
Gwt jetty et sources de données par
Gwt   jetty et sources de donnéesGwt   jetty et sources de données
Gwt jetty et sources de donnéesFranck SIMON
976 vues2 diapositives

Plus de Franck SIMON(18)

Distribuer une librairie via maven par Franck SIMON
Distribuer une librairie via mavenDistribuer une librairie via maven
Distribuer une librairie via maven
Franck SIMON619 vues
Gwt jetty et sources de données par Franck SIMON
Gwt   jetty et sources de donnéesGwt   jetty et sources de données
Gwt jetty et sources de données
Franck SIMON976 vues
Description d'un fichier de prélèvements SEPA minimum par Franck SIMON
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
Franck SIMON29.1K vues
Tomcat and apache httpd training par Franck SIMON
Tomcat and apache httpd trainingTomcat and apache httpd training
Tomcat and apache httpd training
Franck SIMON28K vues
Java - programmation concurrente par Franck SIMON
Java - programmation concurrenteJava - programmation concurrente
Java - programmation concurrente
Franck SIMON2.6K vues
Android Input Method Editor par Franck SIMON
Android   Input Method EditorAndroid   Input Method Editor
Android Input Method Editor
Franck SIMON3.9K vues
Architectures distribuées par Franck SIMON
Architectures distribuéesArchitectures distribuées
Architectures distribuées
Franck SIMON10K vues
Développement Android par Franck SIMON
Développement AndroidDéveloppement Android
Développement Android
Franck SIMON27.7K vues

Dernier

Formation M2i - Augmenter son impact en communication et en management grâce... par
Formation M2i - Augmenter son impact en communication et en management grâce...Formation M2i - Augmenter son impact en communication et en management grâce...
Formation M2i - Augmenter son impact en communication et en management grâce...M2i Formation
41 vues55 diapositives
Newsletter SPW Agriculture en province du Luxembourg du 13-11-23 (adapté au 2... par
Newsletter SPW Agriculture en province du Luxembourg du 13-11-23 (adapté au 2...Newsletter SPW Agriculture en province du Luxembourg du 13-11-23 (adapté au 2...
Newsletter SPW Agriculture en province du Luxembourg du 13-11-23 (adapté au 2...BenotGeorges3
24 vues18 diapositives
FORMATION SUR LES PICTOGRAMMES DE SECURITE KKW.pptx par
FORMATION SUR LES PICTOGRAMMES DE SECURITE KKW.pptxFORMATION SUR LES PICTOGRAMMES DE SECURITE KKW.pptx
FORMATION SUR LES PICTOGRAMMES DE SECURITE KKW.pptxKOUADIO WILLIAMS KOUAME
5 vues17 diapositives
Abréviations et symboles (1).pdf par
Abréviations et symboles (1).pdfAbréviations et symboles (1).pdf
Abréviations et symboles (1).pdfStagiaireLearningmat
25 vues2 diapositives
Présentation de lancement SAE105 par
Présentation de lancement SAE105Présentation de lancement SAE105
Présentation de lancement SAE105JeanLucHusson
20 vues13 diapositives
Formation M2i - Cadre réglementaire des IA Génératives : premiers éléments de... par
Formation M2i - Cadre réglementaire des IA Génératives : premiers éléments de...Formation M2i - Cadre réglementaire des IA Génératives : premiers éléments de...
Formation M2i - Cadre réglementaire des IA Génératives : premiers éléments de...M2i Formation
6 vues36 diapositives

Dernier(13)

Formation M2i - Augmenter son impact en communication et en management grâce... par M2i Formation
Formation M2i - Augmenter son impact en communication et en management grâce...Formation M2i - Augmenter son impact en communication et en management grâce...
Formation M2i - Augmenter son impact en communication et en management grâce...
M2i Formation41 vues
Newsletter SPW Agriculture en province du Luxembourg du 13-11-23 (adapté au 2... par BenotGeorges3
Newsletter SPW Agriculture en province du Luxembourg du 13-11-23 (adapté au 2...Newsletter SPW Agriculture en province du Luxembourg du 13-11-23 (adapté au 2...
Newsletter SPW Agriculture en province du Luxembourg du 13-11-23 (adapté au 2...
BenotGeorges324 vues
Présentation de lancement SAE105 par JeanLucHusson
Présentation de lancement SAE105Présentation de lancement SAE105
Présentation de lancement SAE105
JeanLucHusson20 vues
Formation M2i - Cadre réglementaire des IA Génératives : premiers éléments de... par M2i Formation
Formation M2i - Cadre réglementaire des IA Génératives : premiers éléments de...Formation M2i - Cadre réglementaire des IA Génératives : premiers éléments de...
Formation M2i - Cadre réglementaire des IA Génératives : premiers éléments de...
M2i Formation6 vues
Julia Margaret Cameron par Txaruka
Julia Margaret CameronJulia Margaret Cameron
Julia Margaret Cameron
Txaruka65 vues
Newsletter SPW Agriculture en province de LIEGE du 28-11-23 par BenotGeorges3
Newsletter SPW Agriculture en province de LIEGE du 28-11-23Newsletter SPW Agriculture en province de LIEGE du 28-11-23
Newsletter SPW Agriculture en province de LIEGE du 28-11-23
BenotGeorges323 vues
Julia Margaret Cameron par Txaruka
Julia Margaret Cameron Julia Margaret Cameron
Julia Margaret Cameron
Txaruka5 vues
Newsletter SPW Agriculture en province du Luxembourg du 13-11-23 par BenotGeorges3
Newsletter SPW Agriculture en province du Luxembourg du 13-11-23Newsletter SPW Agriculture en province du Luxembourg du 13-11-23
Newsletter SPW Agriculture en province du Luxembourg du 13-11-23
BenotGeorges36 vues
MNGTCOUT PROJET 04112023.pptx par HAIDI2
MNGTCOUT PROJET 04112023.pptxMNGTCOUT PROJET 04112023.pptx
MNGTCOUT PROJET 04112023.pptx
HAIDI26 vues

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