<!-- Slide number: 1 -->
Conception par Objet et Programmation Java
1

Chapitre 10 : Les Stream
Equipe Java
2019-2020

Notes:
<!-- Slide number: 2 -->
Plan
9#:
Introduction
Classe et objet
Encapsulation
H ritage
Polymorphisme
Exceptions
Interfaces
Collections
Lambda Expression
Stream
Notes:
<!-- Slide number: 3 -->
Objectifs
9#:
Introduire le concept de stream
La programmation fonctionnelle
Manipulation des stream
Utilisation des interfaces fonctionnelles
Utilisation des Lambda expression
Publicité
Notes:
<!-- Slide number: 4 -->
Programmation fonctionnelles
9#:
Le principe g n ral de la programmation fonctionnelle est de concevoir des programmes comme des fonctions math matiques que l'on compose entre elles. A la diff rence des programmes imp ratifs organis s en instructions produisent des effets de bords, les programmes fonctionnels sont b tis sur des expressions dont la valeur est le r sultat du programme.
Notes:
<!-- Slide number: 5 -->
Programmation fonctionnelles
9#:
Un programme fonctionnel consiste en une expression E (repr sentant l'algorithme et les entr es). Cette expression E est sujette des r gles de r criture : la r duction consiste en un remplacement d'une partie de programme fonctionnel par une autre partie de programme selon une r gle de r criture bien d finie. Ce processus de r duction sera r p t jusqu'a l'obtention d'une expression irr ductible (aucune partie ne peut tre r crite). L'expression E* ainsi obtenue est appel e forme normale (fn) de E et constitue la sortie du programme.
Notes:
<!-- Slide number: 6 -->
Stream: D nition
9#:
Un "Stream<T>" d crit une s quence d l ments (de type T) supportant des op rations agr g es en s quence ou en parall le.
LAPI Stream fourni des classes pour supporter des op rations de style fonctionnel sur des flux de valeurs
Notes:
<!-- Slide number: 7 -->
Stream: D nition
9#:
Il est important de ne pas voir les "streams" comme une alternative aux collections mais plut t comme un moyen de traitement associ :
Un "stream" nest pas un moyen de stockage, il ne fait que transmettre des donn es provenant dune source (collection, tableau, g n rateur de donn es, canal dE/S, &) au travers dune file dop rations.
Un "stream" est fonctionnel par nature, une op ration sur un "stream" produit un r sultat mais ne modifie jamais sa source. Un filtrage, par exemple, cr e un nouveau "stream" avec les l ments filtr s, il ne supprime rien de la source.
Notes:
<!-- Slide number: 8 -->
Stream: D nition
9#:
Un "stream" a un mode dex cution paresseux. Les op rations dun "stream" sont de deux types : interm diaires (elles renvoient un "stream" comme le filtrage par exemple) ou terminales (comme la somme vue plus haut). Les op rations interm diaires sont toujours impl ment es de mani re paresseuse, afin de profiter au maximum dune ventuelle optimisation.
Un "stream" est un consommateur, ses l ments ne peuvent tre visit s quune seule fois pendant sa dur e de vie, un nouveau "stream" doit donc tre cr pour parcourir nouveau la source.
Notes:
<!-- Slide number: 9 -->
Publicité
Obtention dun stream
9#:
Il existe plusieurs fa ons pour cr er un "stream". La plus simple consiste appeler la m thode "stream()" ou "parallelStream()" sur une collection, de plus un certain nombre de m thodes ont t ajout es aux classes d j existantes.
Un "stream" sobtient de la mani re suivante :
Depuis une Collection via la m thode "stream()" ou "parallelStream()"
Depuis un tableau via "Arrays.stream(Object[])".
Depuis des m thodes statiques de linterface "Stream<T> comme "Stream.of(Object[])", "IntStream.range(int,int)" ou "Stream.iterate(Object, UnaryOperator) ".
Lors de la lecture dun fichier via "BufferedReader.lines()".
Notes:
<!-- Slide number: 10 -->
Op rations sur les stream
9#:
Lint r t principal dun "stream" r side dans la possibilit deffectuer plusieurs op rations plus ou moins complexes en les encha nant en une seule instruction. Cet encha nement, appel pipeline, est compos de plusieurs op rations interm diaires et dune seule op ration terminale.
Op rations interm diaires :
Chaque op ration interm diaire retourne un nouveau "stream" (permettant ainsi lencha nement des op rations).
Notes:
<!-- Slide number: 11 -->
Op rations sur les stream
9#:
Op rations interm diaires principales :
De m me type
Stream<T> filter(Predicate<T>)
Stream<T> sorted()
Stream<T> sorted(Comparator<T> comparator)
Stream<T> distinct()
Stream<T> limit(long maxSize)
Stream<T> peek(Consumer<T> action) :
Stream<T> skip(long n)
De type diff rent
<R> Stream<R> map(Function<T, R> mapper)
R> Stream<R> flatMap(Function<T, Stream<R>> mapper)
Publicité
Notes:
<!-- Slide number: 12 -->
Op rations sur les stream
9#:
Op rations terminales:
Lop ration terminale dun stream est une op ration finale, celle qui d clenche lex cution du pipeline dop rations (et donc consomme le flux dentr e), produit ( ventuellement) un r sultat puis ferme le "stream".
Op rations terminales principales :
Bool ennes
Les op rations bool ennes "allMatch", "anyMatch" et "noneMatch", qui prennent toutes les trois un "Predicate<T>" en param tre, sont vraies lorsque, respectivement, tous les l ments, au moins un ou aucun satisfont le pr dicat donn .
Notes:
<!-- Slide number: 13 -->
Op rations sur les stream
9#:
Num riques
- long count() : retourne le nombre d l ments du "stream".
- type sum() : retourne la somme des l ments du "stream" (type tant int, double ou long),
Simple
- Optional<T> findAny() : retourne un l ment (nimporte lequel) du "stream".
- Optional<T> findFirst() : retourne le premier l ment du "stream".
- Optional<T> max (Comparator<T>comparator) et Optional<T> min (Comparator<T>comparator) retournent respectivement le maximum et le minimum des l ments du "stream" en accord avec le comparateur donn .
Notes:
<!-- Slide number: 14 -->
Op rations sur les stream
9#:
Complexes
- Collect: "Collect" est une op ration terminale extr mement utile pour transformer les l ments dun "stream" un autre type de r sultat, par exemple une "List", "Set" ou "Map".
- Reduce
L'op ration de r duction combine tous les l ments du "stream" en un seul r sultat
Notes:
<!-- Slide number: 15 -->
Ordre des op rations
9#:
Une caract ristique importante des op rations interm diaires est la paresse ("laziness"). Regardez cet exemple o une op ration terminale est manquante:

Publicité
On ex cutant ce bout de code, rien ne sera affich la console. Cest parce que les op rations interm diaires ne seront ex cut s que lorsque une op ration terminale est pr sente.
Notes:
<!-- Slide number: 16 -->
Ordre des op rations: Exemple 1/4
9#:
tendons l'exemple ci-dessus par l'op ration terminale "forEach":

On ex cutant ce bout de code, rien ne sera affich la console. Cest parce que les op rations interm diaires ne seront ex cut s que lorsque une op ration terminale est pr sente.
Notes:
<!-- Slide number: 17 -->
Ordre des op rations: Exemple 2/4
9#:
Pourquoi l'ordre est important
L'exemple suivant est constitu de deux op rations interm diaires "map" et "filtre" et une op ration terminale "forEach". Essayons de nouveau de voir de pr s la mani re dont ces op rations sont ex cut es:

Notes:
<!-- Slide number: 18 -->
Ordre des op rations: Exemple 3/4
9#:
Comme vous l'aurez devin les op rations "map" et "filtre" sont appel es cinq fois dans la collection alors que la m thode "forEach" est appel e une seule fois.
Nous pouvons r duire le nombre r el d'ex cutions si nous changeons l'ordre des op rations, en d pla ant "filtre" au d but de la cha ne:

Notes:
<!-- Slide number: 19 -->
Ordre des op rations: Exemple 4/4
9#:
Maintenant, la m thode "map" est appel e une seule do les op rations du pipe-line beaucoup plus rapide pour un nombre d' l ments d l ment plus grand. Gardez cela l'esprit lors de la composition dune cha ne des m thodes complexes.