Java Avance - Java : Notation Lambda

Transcription

Java Avance - Java : Notation Lambda
Java Avance
Java : Notation Lambda
Emmanuel ADAM
Université de Valenciennes et du Hainaut-Cambrésis
UVHC/ISTV-LAMIH
E. ADAM
University of Valenciennes
Java Avance
UVHC/ISTV-LAMIH
1 / 19
Plan
1
Java : fonctions lambda
2
Fonctions lambda et gestion de listes
Tri de collections
Fonctions de collections
3
Les flux : faciliter la sélection, l’agrégation
Extrait de collections
Flux : recherche de valeurs extrêmes
Les flux : utilisable une seule fois
Les fournisseurs de flux : utilisables plusieurs fois
Les flux : création et parcours
Les flux : conversion
Les flux : consommateur et fonctions
E. ADAM
University of Valenciennes
Java Avance
UVHC/ISTV-LAMIH
2 / 19
Java : fonctions lambda
Fonctions lambda : remplacement de classes anonymes
Interface à unique fonction
Si une interface n’a qu’une fonction, on peut se passer de la
création d’une classe anonyme.
Supposons l’interface Operation :
i n t e r f a c e Operation
{
p u b l i c double c a l c u l ( double a , double b) ;
}
E. ADAM
University of Valenciennes
Java Avance
UVHC/ISTV-LAMIH
3 / 19
Java : fonctions lambda
Fonctions lambda : remplacement de classes anonymes
Instantiation d’une interface
Classiquement on instancie en créant une classe anonyme à la
volée :
O p e r a t i o n add = new O p e r a t i o n ( ) {
p u b l i c double c a l c u l ( double a , double b)
{
return (a + b) ;
}
};
E. ADAM
University of Valenciennes
Java Avance
UVHC/ISTV-LAMIH
4 / 19
Java : fonctions lambda
Fonctions lambda : remplacement de classes anonymes
Instantiation par notation Lambda
En Lambda on écrit :
O p e r a t i o n add = ( a , b )−>{ r e t u r n ( a+b ) ; } ;
On peut également préciser le type :
O p e r a t i o n add = ( d o u b l e a , d o u b l e b )−>{ r e t u r n ( a+b ) ; } ;
Ou être plus simple :
O p e r a t i o n add = ( a , b )−>(a+b ) ;
De manière générale : (listes de variables) − > code
s’il n’y a qu’un paramètre, les parenthèses sont facultatives
E. ADAM
University of Valenciennes
Java Avance
UVHC/ISTV-LAMIH
5 / 19
Java : fonctions lambda
Fonctions lambda : remplacement de classes anonymes
Exemple d’utilisation
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
O p e r a t i o n add = ( d o u b l e a , d o u b l e b )−>{ r e t u r n ( a+b ) ; } ;
O p e r a t i o n s u b = ( a , b )−>(a−b ) ;
O p e r a t i o n mul = ( a , b )−>(a ∗b ) ;
O p e r a t i o n d i v = ( a , b )−>(a /b ) ;
Operation o = n u l l ;
i n t typeOpe = ( i n t ) ( Math . random ( ) ∗ 4 ) ;
s w i t c h ( typeOpe )
{
c a s e 0 : o = add ; b r e a k ;
c a s e 1 : o = sub ; break ;
c a s e 2 : o = mul ; b r e a k ;
case 3: o = div ; break ;
}
double x = 5 . 2 ;
double y = 2 . 5 ;
System . o u t . p r i n t l n ( ” r e s u l t a t de l ’ o p e r a t i o n ” + typeOpe+ ”
= ” + o . calcul (x , y) ) ;
}
E. ADAM
University of Valenciennes
Java Avance
UVHC/ISTV-LAMIH
6 / 19
Fonctions lambda et gestion de listes
Tri de collections
Fonctions lambda : simplifier le tri de collection
Lambda pour remplacer un Comparator
Un Comparator ne propose qu’une fonction :
int compareTo(Object o)
Lorsqu’une méthode attend un objet de type Comparator,
on peut donc passer en paramètre la fonction lambda
correspondante :
// t r i p a r o r d r e d é c r o i s s a n t
// s i ’ l i s t e ’ c o n t i e n t d e s nombres
// ( b−a ) r e t o u r n e < 0 s i
a e s t p l u s g r a n d que b ,
// donc l e t r i p l a c e r a a a v a n t b , a << b
C o l l e c t i o n s . s o r t ( l i s t e , ( a , b )−> ( b−a ) ) ;
E. ADAM
University of Valenciennes
Java Avance
...
UVHC/ISTV-LAMIH
7 / 19
Fonctions lambda et gestion de listes
Fonctions de collections
Fonctions lambdas pour les ArrayList, Vector, . . .
tris, parcours d’éléments
La fonction void sort(Comparator c) trie les éléments de
la liste
A r r a y L i s t <S t r i n g > noms = new A r r a y L i s t <S t r i n g >(
A r r a y s . a s L i s t ( ” Rebeca ” , ” P a u l a ” , ” Johanna ” ) ) ;
noms . s o r t ( ( a , b )−>a . compareTo ( b ) ) ;
La fonction void forEach(Consumer action) effectue une
action sur chaque élément de la liste
noms . f o r E a c h ( a−>System . o u t . p r i n t l n ( a ) ) ;
E. ADAM
University of Valenciennes
Java Avance
UVHC/ISTV-LAMIH
8 / 19
Fonctions lambda et gestion de listes
Fonctions de collections
Fonctions lambdas pour les ArrayList, Vector, . . .
modification d’éléments
La fonction
void replaceAll(UnaryOperator<E> operator) remplace
chaque élément de la liste par le résultat de l’opération
A r r a y L i s t <I n t e g e r > c a r r e s = new A r r a y L i s t <I n t e g e r >(
Arrays . a s L i s t (1 ,2 ,3 ,4 ,5) ) ;
c a r r e s . r e p l a c e A l l ( a−>(a ∗ a ) ) ;
La fonction boolean removeIf(Predicate condition)
retire les éléments de la liste qui répondent à la condition
// r e t i r e r l e s nombres de l a
c a r r e s . r e m o v e I f ( a−>(a <10) ) ;
E. ADAM
University of Valenciennes
liste
Java Avance
i n f é r i e u r s à 5
UVHC/ISTV-LAMIH
9 / 19
Les flux : faciliter la sélection, l’agrégation
Extrait de collections
Fonctions lambda : extraire des éléments d’une collection
Lambda pour remplacer un Filtre
Un Filtre attend une fonction de type prédicat
// c r e a t i o n d ’ une l i s t e de 10 r é e l s p r i s a l é a t o i r e m e n t
A r r a y L i s t <Double> l i s t e = new A r r a y L i s t <Double >() ;
f o r ( i n t i =0; i <10; i ++) l i s t e . add ( Math . random ( ) ∗ 1 0 ) ;
l i s t e . f o r E a c h ( e−>System . o u t . p r i n t f ( ” %.3 f ; ” , e ) ) ;
System . o u t . p r i n t l n ( ) ;
// c r é a t i o n d ’ un t a b l e a u c o n t e n a n t l e s é l é m e n t s < à 5
O b j e c t [ ] i n f = l i s t e . s t r e a m ( ) . f i l t e r ( a −> ( a <5) ) . t o A r r a y ( ) ;
f o r ( Object d : i n f )
System . o u t . p r i n t f ( ” %.3 f ; ” , d ) ;
System . o u t . p r i n t l n ( ) ;
E. ADAM
University of Valenciennes
Java Avance
UVHC/ISTV-LAMIH
10 / 19
Les flux : faciliter la sélection, l’agrégation
Extrait de collections
Filtre : utilisation de prédicat
Utilisation de prédicat
Un Filtre attend une fonction de type prédicat
Stream<T> f i l t e r ( P r e d i c a t e <? s u p e r T> p r e d i c a t e )
Un Predicat possède une seule méthode fonctionnelle :
b o o l e a n t e s t (T t )
T prend le type du flux sur lequel il est appliqué
E. ADAM
University of Valenciennes
Java Avance
UVHC/ISTV-LAMIH
11 / 19
Les flux : faciliter la sélection, l’agrégation
Flux : recherche de valeurs extrêmes
Flux : recherche de valeurs extrêmes
Recherche de minimum (et de maximum)
la fonction min (et max) applique un comparateur aux valeurs
d’un flux et retourne la valeur la plus petite, en accord avec le
comparateur
La valeur peut être nulle, le type est donc “Optionel”
O p t i o n a l <T> min ( Comparator <? s u p e r T> c o m p a r a t o r )
la fonction
boolean i s P r e s e n t ()
permet de savoir si un objet optionnel contient une valeur.
la fonction
T get ()
permet récupérer la valeur de l’objet optionnel
E. ADAM
University of Valenciennes
Java Avance
UVHC/ISTV-LAMIH
12 / 19
Les flux : faciliter la sélection, l’agrégation
Flux : recherche de valeurs extrêmes
Flux : recherche de valeurs extrêmes
Recherche de minimum
Stream<I n t e g e r > s = Stream . o f ( 1 , 8 , 4 , 5 , 6 ) ;
O p t i o n a l <I n t e g e r > m i n i = s . min ( ( a , b ) −> ( a−b ) ) ;
i f ( mini . i s P r e s e n t () )
System . o u t . p r i n t l n ( ” p l u s p e t i t
E. ADAM
University of Valenciennes
e l t = ” + mini . get () ) ;
Java Avance
UVHC/ISTV-LAMIH
13 / 19
Les flux : faciliter la sélection, l’agrégation
Les flux : utilisable une seule fois
Les flux : utilisable une seule fois
Attention : un seul parcours possible
impossibilité de lire le flux pour une fonction (exemple min) et
de le reparcourir pour une autre fonction (exemple max)
Stream<I n t e g e r > s = Stream . o f ( 1 , 8 , 4 , 5 , 6 ) ;
O p t i o n a l <I n t e g e r > m i n i = s . min ( ( a , b ) −>
O p t i o n a l <I n t e g e r > maxi = s . max ( ( a , b ) −>
( a−b ) ) ;
( a−b ) ) ;
déclenche une erreur
E x c e p t i o n i n t h r e a d ” main ” j a v a . l a n g . I l l e g a l S t a t e E x c e p t i o n :
s t r e a m h a s a l r e a d y b e e n o p e r a t e d upon o r c l o s e d
E. ADAM
University of Valenciennes
Java Avance
UVHC/ISTV-LAMIH
14 / 19
Les flux : faciliter la sélection, l’agrégation
Les fournisseurs de flux : utilisables plusieurs fois
Les fournisseurs de flux : utilisable plusieurs fois
Palier au problème de l’utilisation unique de flux
Un fournisseur de flux crée un flux à l’appel de la méthode
get()
S u p p l i e r <Stream<I n t e g e r >> f o u r n i s s e u r =
( ) −> Stream . o f ( 1 , 8 , 4 , 5 , 6 ) ;
Pour obtenir le min ET le max, on écrira :
S u p p l i e r <Stream<I n t e g e r >> f o u r n i s s e u r =
( ) −> Stream . o f ( 1 , 8 , 4 , 5 , 6 ) ;
O p t i o n a l <I n t e g e r > m i n i =
f o u r n i s s e u r . g e t ( ) . min ( ( a , b ) −> ( a−b ) ) ;
i f ( mini . i s P r e s e n t () )
System . o u t . p r i n t l n ( ” p l u s p e t i t e l t = ” + m i n i . g e t ( ) ) ;
O p t i o n a l <I n t e g e r > maxi =
f o u r n i s s e u r . g e t ( ) . max ( ( a , b ) −> ( a−b ) ) ;
i f ( maxi . i s P r e s e n t ( ) )
System . o u t . p r i n t l n ( ” p l u s g r a n d e l t = ” + maxi . g e t ( ) ) ;
E. ADAM
University of Valenciennes
Java Avance
UVHC/ISTV-LAMIH
15 / 19
Les flux : faciliter la sélection, l’agrégation
Les flux : création et parcours
Les flux : création et parcours
Création automatique
il est possible de remplir automatiquement un flux
s t a t i c <T> Stream<T> i t e r a t e (T debut , U n a r y O p e r a t o r <T>
iteration )
débute un flux avec la valeur ‘debut’ et applique la fonction
‘iteration’ sur celui-ci.
exemple, création d’un flux contenant les entiers de 0 à 9 :
Stream<I n t e g e r > s = Stream . i t e r a t e ( 0 , i −> i +1) . l i m i t
(10) ;
E. ADAM
University of Valenciennes
Java Avance
UVHC/ISTV-LAMIH
16 / 19
Les flux : faciliter la sélection, l’agrégation
Les flux : création et parcours
Les flux : création et parcours
Parcours et actions automatiques
il est possible d’appliquer une action à chaque élément de la
liste :
v o i d f o r E a c h ( Consumer <? s u p e r T> a c t i o n )
applique une fonction qui ne retourne aucune valeur à chaque
élément du flux
exemple, affichage des doubles d’un flux d’entiers
s . f o r E a c h ( e l t −> { System . o u t . p r i n t ( ” ” + e l t ∗2 + ” , ” ) ; } ) ;
E. ADAM
University of Valenciennes
Java Avance
UVHC/ISTV-LAMIH
17 / 19
Les flux : faciliter la sélection, l’agrégation
Les flux : conversion
Les flux : conversion
Conversion d’un flux en un autre flux
il est possible d’appliquer une opération à chaque élément
d’un flux et de créer un flux contenant les résultats :
<R> Stream<R> map ( F u n c t i o n <? s u p e r T , ? e x t e n d s R>
mapper )
applique la fonction mapper qui prend un élément de type T
et retourne un élément de type R
exemple, création d’une liste d’entiers de 1 à 10, et création
d’un flux contenant la racine carrée de ces entiers :
Stream<I n t e g e r > s = Stream . i t e r a t e ( 1 , i −> i +1) . l i m i t ( 1 0 ) ;
Stream<Double> s r o o t = s . map ( x −> Math . s q r t ( x ) ) ;
s r o o t . f o r E a c h ( a −> { System . o u t . p r i n t f ( ” %.3 f ; ” , a ) ; } ) ;
E. ADAM
University of Valenciennes
Java Avance
UVHC/ISTV-LAMIH
18 / 19
Les flux : faciliter la sélection, l’agrégation
Les flux : consommateur et fonctions
Les consommateurs et fonctions
Notation allégée pour consommateur et fonctions
il est possible de préciser le type des variables,
Stream<Double> s p r i m e = s . map ( ( I n t e g e r x ) −>
Math . s q r t ( x ) ) ;
s r o o t . f o r E a c h ( ( D o u b l e a ) −>
{ System . o u t . p r i n t f ( ” %.3 f ; ” , a ) ; } ) ;
il est possible pour simplifier de ne pas les indiquer
Stream<Double> s r o o t = s . map ( x −> Math . s q r t ( x ) ) ;
s r o o t . f o r E a c h ( a −> { System . o u t . p r i n t f ( ” %.3 f ; ” , a ) ; } ) ;
il est même possible de ne pas nommer la variables ! !
Stream<Double> s r o o t = s . map ( Math : : s q r t ) ;
s p r i m e . f o r E a c h ( System . o u t : : p r i n t l n ) ;
E. ADAM
University of Valenciennes
Java Avance
UVHC/ISTV-LAMIH
19 / 19