Java Lambda
Java Lambda
Java Lambda
Plan
1 Introduction
2 Cas d’utilisation
3 Syntaxe
Plan
1 Introduction
2 Cas d’utilisation
3 Syntaxe
Plan
1 Introduction
2 Cas d’utilisation
3 Syntaxe
p u b l i c enum Sex {
MALE, FEMALE
}
S t r i n g name ;
LocalDate b i r t h d a y ;
Sex gender ;
S t r i n g emailAddress ;
p u b l i c i n t getAge ( ) {
// ...
}
Approche 1 :
créer une méthode par traitement
Exemple dans RosterTest.java
s t a t i c L i s t <Person > r o s t e r ;
. . .
Défauts
fortement lié à l’API de Person
ne considère qu’un seul cas : plusVieuxQue
Approche 2 :
créer une méthode plus générale
RosterTest.java
p u b l i c s t a t i c v o i d printPersonsWithinAgeRange (
L i s t <Person > r o s t e r , i n t low , i n t h i g h ) {
f o r ( Person p : r o s t e r ) {
i f ( low <= p . getAge ( ) && p . getAge ( ) < h i g h ) {
p . printPerson ( ) ;
}
}
}
Défauts
toujours fortement liée à l’API de Person
plus générique mais toujours liée à une recherche spécifique
Approche 3 :
séparer traitement / requête
RosterTest.java
p u b l i c s t a t i c v o i d p r i n t P e r s o n s ( L i s t <Person > r o s t e r , CheckPerson t e s t e r ) {
f o r ( Person p : r o s t e r ) {
i f ( tester . test (p)) {
p . printPerson ( ) ;
}
}
}
CheckPerson.java
i n t e r f a c e CheckPerson {
boolean t e s t ( Person p ) ;
}
Approche 3 :
séparer traitement / requête
CheckPersonEligibleForSelectiveService.java
c l a s s C h e c k P e r s o n E l i g i b l e F o r S e l e c t i v e S e r v i c e implements CheckPerson {
p u b l i c boolean t e s t ( Person p ) {
r e t u r n p . gender == Person . Sex .MALE &&
p . getAge ( ) >= 18 &&
p . getAge ( ) <= 2 5 ;
}
}
RosterTest.java
p r i n t P e r s o n s ( r o s t e r , new C h e c k P e r s o n E l i g i b l e F o r S e l e c t i v e S e r v i c e ( ) ) ;
Défaut
non liéé à l’API de Person mais nécessite une classe de plus
Cours Java - F. Michel
10 / 27
Introduction Cas d’utilisation Syntaxe Références de méthodes
Approche 4 :
utiliser une class interne anonyme
RosterTest.java
printPersons (
roster ,
new CheckPerson ( ) {
p u b l i c boolean t e s t ( Person p ) {
r e t u r n p . getGender ( ) == Person . Sex .MALE
&& p . getAge ( ) >= 18
&& p . getAge ( ) <= 2 5 ;
}
}
);
Défaut
pas de nouvelle classe mais un code assez lourd
Approche 5 :
utiliser une lambda comme paramètre
RosterTest.java
printPersons (
roster ,
( Person p ) −> p . getGender ( ) == Person . Sex .MALE
&& p . getAge ( ) >= 18
&& p . getAge ( ) <= 25
);
Remarque
Nécessite que la méthode (signature) de l’approche 4 existe :
RosterTest.printPersons(List<Person>,
CheckPerson)
Approche 6 :
réutiliser le JDK
à propos de CheckPerson.java
i n t e r f a c e CheckPerson {
boolean t e s t ( Person p ) ;
}
Remarques
Interface très simple : une seule méthode abstraite
⇒ Interface dite fonctionnelle
plusieurs interfaces fonctionnelles existent déjà : java.util.fonction
java.util.function.Predicate<T> propose un
trairement équivalent à CheckPerson : un test sur un type
Approche 6 :
réutiliser le JDK
Predicate<T> à la place de CheckPerson ⇒
RosterTest.java
public s t a t i c void printPersonsWithPredicate (
L i s t <Person > r o s t e r , P r e d i c a t e <Person > t e s t e r ) {
f o r ( Person p : r o s t e r ) {
i f ( tester . test (p)) {
p . printPerson ( ) ;
}
}
}
utilisation ⇒
printPersonsWithPredicate (
roster ,
p −> p . getGender ( ) == Person . Sex .MALE
&& p . getAge ( ) >= 18
&& p . getAge ( ) <= 25
);
Approche 7 :
plus de lambdas
Remplacer print par un autre traitement object -> void ?
public s t a t i c void printPersonsWithPredicate (
L i s t <Person > r o s t e r , P r e d i c a t e <Person > t e s t e r ) {
f o r ( Person p : r o s t e r ) {
i f ( tester . test (p)) {
p . printPerson ( ) ;
}
}
}
utilisation de java.util.function.Consumer<Y>
p u b l i c s t a t i c v o i d processPersons (
L i s t <Person > r o s t e r ,
P r e d i c a t e <Person > t e s t e r ,
Consumer<Person > b l o c k ) {
f o r ( Person p : r o s t e r ) {
i f ( tester . test (p)) {
b l o c k . accept ( p ) ;
}
}}
Cours Java - F. Michel
15 / 27
Introduction Cas d’utilisation Syntaxe Références de méthodes
Approche 7 :
processPersons(List<Person>,
Predicate<Person>, Consumer<Person>)
p u b l i c s t a t i c v o i d processPersons (
L i s t <Person > r o s t e r ,
P r e d i c a t e <Person > t e s t e r ,
Consumer<Person > b l o c k ) {
f o r ( Person p : r o s t e r ) {
i f ( tester . test (p)) {
b l o c k . accept ( p ) ;
}
}}
Approche 7 suite
Consumer<Y> sur le résultat de
Function<T,R>
processPersonsWithFunction(List<Person>,
Predicate<Person>, Function<Person, String>,
Consumer<String>)
p u b l i c s t a t i c v o i d processPersonsWithFunction (
L i s t <Person > r o s t e r ,
P r e d i c a t e <Person > t e s t e r ,
Function <Person , S t r i n g > mapper ,
Consumer< S t r i n g > b l o c k ) {
f o r ( Person p : r o s t e r ) {
i f ( tester . test (p)) {
S t r i n g data = mapper . a p p l y ( p ) ;
b l o c k . accept ( data ) ;
}
}
}
Approche 7 suite
Utilisation
p u b l i c s t a t i c v o i d processPersonsWithFunction (
L i s t <Person > r o s t e r ,
P r e d i c a t e <Person > t e s t e r ,
Function <Person , S t r i n g > mapper ,
Consumer< S t r i n g > b l o c k ) {
f o r ( Person p : r o s t e r ) {
i f ( tester . test (p)) {
S t r i n g data = mapper . a p p l y ( p ) ;
b l o c k . accept ( data ) ;
}
}
}
. . .
processPersonsWithFunction (
roster ,
p −> p . getGender ( ) == Person . Sex .MALE
&& p . getAge ( ) >= 18
&& p . getAge ( ) <= 25 ,
p −> p . getEmailAddress ( ) ,
e m a i l −> System . o u t . p r i n t l n ( e m a i l )
);
. . .
processElements (
roster ,
p −> p . getGender ( ) == Person . Sex .MALE
&& p . getAge ( ) >= 18
&& p . getAge ( ) <= 25 ,
p −> p . getEmailAddress ( ) ,
e m a i l −> System . o u t . p r i n t l n ( e m a i l )
);
Plan
1 Introduction
2 Cas d’utilisation
3 Syntaxe
exemples équivalents
p −> p . getGender ( ) == Person . Sex .MALE
&& p . getAge ( ) >= 18
&& p . getAge ( ) <= 25
. . .
p −> {
r e t u r n p . getGender ( ) == Person . Sex .MALE
&& p . getAge ( ) >= 18
&& p . getAge ( ) <= 2 5 ;
}
Cours Java - F. Michel
22 / 27
Introduction Cas d’utilisation Syntaxe Références de méthodes
Plan
1 Introduction
2 Cas d’utilisation
3 Syntaxe
. . .
. . .
. . .
A r r a y s . s o r t ( r o s t e r A s A r r a y , new PersonAgeComparator ( ) ) ;
. . . / / r e p l a c e d by
Arrays . s o r t ( rosterAsArray ,
( Person a , Person b ) −> {
r e t u r n a . g e t B i r t h d a y ( ) . compareTo ( b . g e t B i r t h d a y ( ) ) ;
}
);
. . . / / r e p l a c e d by
. . . / / r e p l a c e d by
A r r a y s . s o r t ( r o s t e r A s A r r a y , Person : : compareByAge ) ;
Conclusion
Ressources Web
Développons en Java sur les lambdas