Java 8 - interfaces

Franck SIMON
Franck SIMONConsultant architecte logiciel Java EE et IoT (Internet des Objets) à Transtel
Java 8
Interfaces
antislashn.org Java 8 - interfaces 2 / 34
Introduction
● Java 8 modifie le concept d'interface, en permettant à
une interface d'avoir
● des méthodes statiques
● des méthodes par défaut
● une seule méthode abstraite, pour définir une interface
fonctionnelle
antislashn.org Java 8 - interfaces 3 / 34
Méthode statique
● Une interface peut recevoir des méthodes statiques
● une méthode statique ne peut pas être redéfinie dans une
classe fille
● ne peut pas utiliser la référence this, puisque statique
● Les méthodes statiques d'interface ne peuvent être
utilisées que sur l'interface
● par sur les classes implémentant l'interface
● classiquement, par le nom de l'interface
antislashn.org Java 8 - interfaces 4 / 34
Méthode statique
● Permet de regrouper un ensemble de fonctionnalités
dans une interface
● Améliore la sécurité, car les classes filles ne peuvent
pas redéfinir la méthode statique
● Une méthode statique ne peut pas se substituer à
une méthode de la classe Object
● erreur
– "This static method cannot hide the instance method from
Object"
antislashn.org Java 8 - interfaces 5 / 34
Méthode statique
● Exemple
public interface Foo {
static boolean isNullOrEmpty(String str) {
return str == null ? true : str.equals("") ? true : false;
}
}
antislashn.org Java 8 - interfaces 6 / 34
Méthode par défaut
● Le qualificateur default marque une méthode par
défaut
● la classe fille n'est pas obligée de fournir une
implémentation
● this est utilisable dans la méthode par défaut
– ce n'est pas une méthode statique
antislashn.org Java 8 - interfaces 7 / 34
Méthode par défaut
● Exemple
public interface Roulable
{
default void rouler(){
System.out.println("Objet pouvant rouler par défaut");
}
}
public class Ballon implements Roulable
{
}
public class De implements Roulable
{
@Override
public void rouler()
{
System.out.println("valeur obtenue : "+((int)(Math.random()*6)+1));
}
}
antislashn.org Java 8 - interfaces 8 / 34
Méthode par défaut
● Une première utilité des méthodes par défaut est
l'intégration de nouvelles fonctionnalités sans avoir à
intervenir sur le code existant
● assure la compatibilité avec le code déjà écrit pour
l'ancienne version d'une interface
antislashn.org Java 8 - interfaces 9 / 34
Méthode par défaut
● Permet d'implémenter le concept de trait en Java
● le trait, ou extension, encapsule un ensemble cohérent de
méthodes
● ensemble de méthodes concrètes pouvant être ajoutée à
une classe pour étendre ses fonctionnalités
● il est composé :
– d'une méthode abstraite
– des méthodes additionnelles implémentées par le trait et utilisant
la méthode abstraite
antislashn.org Java 8 - interfaces 10 / 34
Méthode par défaut
● Exemple de trait
● l'interface Java Comparable possède une méthode
unique compareTo()
– cette méthode renvoie un int
● il est intéressant sémantiquement d'avoir des méthodes
telles que :
– greaterThan()
– lessThan()
– isBefore()
– isAfter()
– isSame()
antislashn.org Java 8 - interfaces 11 / 34
Méthode par défaut
● Exemple de trait
● les classes concrètes implémentant Orderable auront
juste à définir la méthode compareTo(), héritée de
Comparable
public interface Odrderable<T> extends Comparable<T> {
public default boolean isAfter(T other) {
return compareTo(other) > 0;
}
public default boolean isBefore(T other) {
return compareTo(other) < 0;
}
public default boolean isSameAs(T other) {
return compareTo(other) == 0;
}
}
antislashn.org Java 8 - interfaces 12 / 34
Méthode par défaut
● Que ce passe-t-il si deux interfaces possèdent une
méthode par défaut ayant la même signature ?
● la classe qui implémente les deux interfaces doit fournir
une implémentation de la méthode
public interface InterfaceA {
default void foo() {
System.out.println("InterfaceA - foo()");
}
}
public interface InterfaceB {
default void foo() {
System.out.println("InterfaceB - foo()");
}
}
public class ABImpl implements InterfaceA, InterfaceB {
}
antislashn.org Java 8 - interfaces 13 / 34
Méthode par défaut
● Il suffit alors de fournir le code pour la méthode
foo()
● exemples d'implémentation
public class ABImpl implements InterfaceA, InterfaceB {
@Override
public void foo() {
System.out.println("ABImpl - foo()");
}
}
public class ABImpl implements InterfaceA, InterfaceB {
@Override
public void foo() {
InterfaceB.super.foo();
}
}
antislashn.org Java 8 - interfaces 14 / 34
Interface fonctionnelle
● Interface qui possède une seule méthode abstraite
● SAM : Single Abstract Method
● l'annotation @FunctionnalInterface permet au
compilateur de vérifier que l'interface ne comporte qu'une
seule méthode abstraite
● peut posséder des méthodes par défaut
@FunctionalInterface
public interface Operation
{
int compute(int x, int y);
}
antislashn.org Java 8 - interfaces 15 / 34
Interface fonctionnelle
● Objectif : définir une signature de méthode qui pourra
être utilisée pour passer en paramètre :
● une référence vers une méthode statique
● une référence vers une méthode d'instance
● une référence vers un constructeur
● une expression lambda
● Un certains nombre d'interfaces fonctionnelles sont
fournies par Java 8 dans le package
java.util.function
antislashn.org Java 8 - interfaces 16 / 34
Interface fonctionnelle
● Exemple d'interface fonctionnelle
● Exemple d'utilisation de l'interface
@FunctionalInterface
public interface Operation
{
int compute(int x, int y);
}
public class Calcul
{
public static int compute(int x, int y, Operation op){
return op.compute(x,y);
}
}
antislashn.org Java 8 - interfaces 17 / 34
Interface fonctionnelle
● Classiquement, cette interface est implémentée par
une classe
● utilisation
public class Addition implements Operation
{
@Override
public int compute(int x, int y)
{
return x+y;
}
}
...
Operation op = new Addition();
int r = Calcul.compute(2, 2, op);
...
antislashn.org Java 8 - interfaces 18 / 34
Interface fonctionnelle
● Ou passée comme classe anonyme
...
r = Calcul.compute(5, 6, new Operation()
{
@Override
public int compute(int x, int y)
{
return x-y;
}
});
...
antislashn.org Java 8 - interfaces 19 / 34
Interface fonctionnelle
● Exemple d'une interface de création
● retourne un objet fabriqué avec trois String
● Exemple de classe utilisant l'interface
@FunctionalInterface
public interface Creator<T> {
T create(String str1, String str2, String str3);
}
public class ContactParser<T> {
public T parse(String nomComplet, Creator<T> creator) {
String[] items = nomComplet.split(" ");
String civilite = items[0];
String nom = items[1];
String prenom = items[2];
return creator.create(civilite, nom, prenom);
}
}
antislashn.org Java 8 - interfaces 20 / 34
Interface fonctionnelle
● Exemple de classe Contact (extrait)
● le constructeur prend 3 paramètres de type String
public class Contact {
private String civilite;
private String nom;
private String prenom;
public Contact() {}
public Contact(String civilite, String nom, String prenom) {
this.civilite = civilite;
this.nom = nom;
this.prenom = prenom;
}
...
}
antislashn.org Java 8 - interfaces 21 / 34
Interface fonctionnelle
● Réponse de Java 8
● sans modification de l'existant nous pouvons passer toute
méthode qui
– accepte les mêmes types de paramètre
● 3 paramètres de type String
– retourne le même type
● générique T
antislashn.org Java 8 - interfaces 22 / 34
Interface fonctionnelle
● Avec Java 8, nous pouvons éviter la création d'une
classe anonyme de type Creator<Contact>
● par une référence vers le constructeur de Contact
– la syntaxe ::<method> définit une référence vers une méthode
● ici il y a bien un constructeur Contact(String,String, String)
ContactParser<Contact> parser = new ContactParser<>();
Contact contact = parser.parse("M LAGAFFE Gaston", Contact::new);
public class ContactParser<T> {
public T parse(String nomComplet, Creator<T> creator) {
,,,
return creator.create(civilite, nom, prenom);
}
}
antislashn.org Java 8 - interfaces 23 / 34
Référence à une méthode
● Syntaxe permettant de référencer directement une
méthode ou un constructeur
● opérateur ::
● référence à un constructeur par défaut
– sans paramètre
● référence à une méthode
– statique ou non
System.out::println o -> System.out.println(o)est équivalent à
antislashn.org Java 8 - interfaces 24 / 34
Référence à une méthode
● Exemples
public class Voiture
{
public static Voiture create(final Supplier<Voiture> supplier){
return supplier.get();
}
public void rouler(){
System.out.println("Rouler");
}
}
public static void main(String[] args)
{
List<Voiture> voitures = new ArrayList<>();
voitures.add(Voiture.create(Voiture::new));
voitures.add(Voiture.create(Voiture::new));
voitures.add(Voiture.create(Voiture::new));
voitures.forEach(Voiture::rouler);
}
antislashn.org Java 8 - interfaces 25 / 34
java.util.function
● Nombreuses interfaces fonctionnelles
● définies avec des types génériques
● Interfaces de base :
● Consumer
– accepte un argument T et ne retourne pas de résultat
● Function
– accepte un argument T et retourne un résultat R
● Supplier
– ne prend pas d'argument et retourne un résultat T
● Predicate
– test un valeur T et retourne un booléen
antislashn.org Java 8 - interfaces 26 / 34
java.util.function.Consumer
● Abstraction d'une opération acceptant un seul
argument et ne renvoyant aucun résultat
● méthodes
– accept(T t) : exécute une opération sur le paramètre
● méthode abstraite
– andThen(Consumer<? super T> after) : exécute
l'opération accept puis l'opération accept sur after
antislashn.org Java 8 - interfaces 27 / 34
java.util.function.Consumer
● Exemple
List<String> types = new ArrayList<>(Arrays.asList("rock","trip hop","jazz","pop","rock"));
List<String> result = new ArrayList<>();
Consumer<String> c1 = result::add;
Consumer<String> c2 = System.out::println;
Consumer<String> c3 = c1.andThen(c2);
types.stream().forEach(c3); // BAD PATTERN (result::add)
System.out.println(result);
antislashn.org Java 8 - interfaces 28 / 34
java.util.function.Supplier
● Abstraction d'une fonction retournant une valeur
● le Supplier produit une valeur
– abstraction d'un factory
● le Consumer consomme une valeur
● méthode
– T get() : produit une valeur de type T
● méthode abstraite
antislashn.org Java 8 - interfaces 29 / 34
java.util.function.Supplier
● Exemples
Supplier<Point> pointSupplier = new Supplier<Point>(){
private int i = 0;
@Override
public Point get(){
i++;
return new Point(i,i);
}
};
Point p1 = pointSupplier.get();
Point p2 = pointSupplier.get();
Supplier<Point> pointSupplier = Point::new;
Point p1 = pointSupplier.get();
Point p2 = pointSupplier.get();
antislashn.org Java 8 - interfaces 30 / 34
java.util.function.Function
● Abstraction d'une fonction acceptant un paramètre et
retournant un résultat
● Function<T,R> : T argument, R résultat
● méthodes
– R apply(T t) : applique la fonction à l'argument t
– <T> Function<T,T> identity() : retourne toujours l'argument
– <V> Function<R,V> andThen(Function<R,V> after) :
retourne une fonction qui applique la fonction, puis applique after sur
le résultat
– <V> Function<V,R> compose(Function<V,T> before) :
retourne une fonction qui applique before, puis applique la fonction
sur le résultat de before
antislashn.org Java 8 - interfaces 31 / 34
java.util.function.Function
● Exemple
List<Point> points = new ArrayList<>();
initPoints(points);
Function<Point,Integer> f1 = p -> p.getX();
Stream<Point> stream = points.stream();
Stream<Integer> xs = stream.map(f1);
xs.forEach(System.out::println);
antislashn.org Java 8 - interfaces 32 / 34
java.util.function.Predicate
● Abstraction d'un prédicat (fonction retournant true
ou false)
● méthodes
– test(T t) : évalue le prédicat sur t
● méthode abstraite
– and(), or(), isEqual(), negate() : permet l'évaluation et le
chaînage des prédicats
antislashn.org Java 8 - interfaces 33 / 34
java.util.function.Predicate
● Exemple
List<String> types = new ArrayList<>(Arrays.asList("rock","trip hop","jazz","pop","rock"));
Predicate<String> p1 = s -> s.length() >3;
Predicate<String> p2 = s -> s.length() <5;
List<String> result = types.stream().filter(p1.and(p2)).collect(Collectors.toList());
System.out.println(result);
antislashn.org Java 8 - interfaces 34 / 34
java.util.function
● Les interfaces de base servent à définir de
nombreuses interfaces fonctionnelles sur les types
de base
● IntConsumer
● LongToIntFunction
● DoubleSupplier
● cf. javadoc
1 sur 34

Recommandé

Java 8 - collections et stream par
Java 8 - collections et streamJava 8 - collections et stream
Java 8 - collections et streamFranck SIMON
1.5K vues29 diapositives
Introduction àJava par
Introduction àJavaIntroduction àJava
Introduction àJavaChristophe Vaudry
3K vues452 diapositives
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
Chapitre 5 classes abstraites et interfaces par
Chapitre 5  classes abstraites et interfacesChapitre 5  classes abstraites et interfaces
Chapitre 5 classes abstraites et interfacesAmir Souissi
2K vues9 diapositives
Java par
JavaJava
JavaSimo Tkouki
1.6K vues30 diapositives
Chap 6 : classes et interfaces par
Chap 6 : classes et interfacesChap 6 : classes et interfaces
Chap 6 : classes et interfacesAziz Darouichi
780 vues97 diapositives

Contenu connexe

Tendances

Cours design pattern m youssfi partie 5 adapter par
Cours design pattern m youssfi partie 5 adapterCours design pattern m youssfi partie 5 adapter
Cours design pattern m youssfi partie 5 adapterENSET, Université Hassan II Casablanca
11.8K vues9 diapositives
Java 8 Lambda Built-in Functional Interfaces par
Java 8 Lambda Built-in Functional InterfacesJava 8 Lambda Built-in Functional Interfaces
Java 8 Lambda Built-in Functional InterfacesGanesh Samarthyam
3.2K vues32 diapositives
Formation JPA Avancé / Hibernate gratuite par Ippon 2014 par
Formation JPA Avancé / Hibernate gratuite par Ippon 2014Formation JPA Avancé / Hibernate gratuite par Ippon 2014
Formation JPA Avancé / Hibernate gratuite par Ippon 2014Ippon
19.9K vues294 diapositives
eServices-Tp1: Web Services par
eServices-Tp1: Web ServiceseServices-Tp1: Web Services
eServices-Tp1: Web ServicesLilia Sfaxi
5.7K vues13 diapositives
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 NodeJS avec TypeScript Express MongoDB par
Support NodeJS avec TypeScript Express MongoDBSupport NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDBENSET, Université Hassan II Casablanca
19.1K vues55 diapositives

Tendances(20)

Java 8 Lambda Built-in Functional Interfaces par Ganesh Samarthyam
Java 8 Lambda Built-in Functional InterfacesJava 8 Lambda Built-in Functional Interfaces
Java 8 Lambda Built-in Functional Interfaces
Ganesh Samarthyam3.2K vues
Formation JPA Avancé / Hibernate gratuite par Ippon 2014 par Ippon
Formation JPA Avancé / Hibernate gratuite par Ippon 2014Formation JPA Avancé / Hibernate gratuite par Ippon 2014
Formation JPA Avancé / Hibernate gratuite par Ippon 2014
Ippon19.9K vues
eServices-Tp1: Web Services par Lilia Sfaxi
eServices-Tp1: Web ServiceseServices-Tp1: Web Services
eServices-Tp1: Web Services
Lilia Sfaxi5.7K vues
Correction Examen 2016-2017 POO .pdf par slimyaich3
Correction Examen 2016-2017 POO .pdfCorrection Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdf
slimyaich3393 vues
POO Java Chapitre 6 Exceptions par Mouna Torjmen
POO Java  Chapitre 6 ExceptionsPOO Java  Chapitre 6 Exceptions
POO Java Chapitre 6 Exceptions
Mouna Torjmen1.4K vues
Fondamentaux java par Ines Ouaz
Fondamentaux javaFondamentaux java
Fondamentaux java
Ines Ouaz3K vues
Examen sybase - Administration base de donnees par webreaker
Examen sybase - Administration base de donneesExamen sybase - Administration base de donnees
Examen sybase - Administration base de donnees
webreaker1.3K vues
Application web php5 html5 css3 bootstrap par Bassem ABCHA
Application web php5 html5 css3 bootstrapApplication web php5 html5 css3 bootstrap
Application web php5 html5 css3 bootstrap
Bassem ABCHA4.6K vues
Presentation JEE et son écossystéme par Algeria JUG
Presentation JEE et son écossystémePresentation JEE et son écossystéme
Presentation JEE et son écossystéme
Algeria JUG2.2K vues

Similaire à Java 8 - interfaces

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
Java 8 - lambda par
Java 8 - lambdaJava 8 - lambda
Java 8 - lambdaFranck SIMON
611 vues20 diapositives
Memo java par
Memo javaMemo java
Memo javaGhazouani Mahdi
2.5K vues8 diapositives
POO - Chapitre6.pptx par
POO - Chapitre6.pptxPOO - Chapitre6.pptx
POO - Chapitre6.pptxRAYENBOUAFIF1
5 vues50 diapositives
Comment écrire du code testable ? par
Comment écrire du code testable ?Comment écrire du code testable ?
Comment écrire du code testable ?Fou Cha
5K vues114 diapositives
Geek Time Janvier 2017 : Java 8 par
Geek Time Janvier 2017 : Java 8Geek Time Janvier 2017 : Java 8
Geek Time Janvier 2017 : Java 8OLBATI
287 vues17 diapositives

Similaire à Java 8 - interfaces(20)

Interface fonctionnelle, Lambda expression, méthode par défaut, référence de... par MICHRAFY MUSTAFA
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 MUSTAFA4.9K vues
Comment écrire du code testable ? par Fou Cha
Comment écrire du code testable ?Comment écrire du code testable ?
Comment écrire du code testable ?
Fou Cha5K vues
Geek Time Janvier 2017 : Java 8 par OLBATI
Geek Time Janvier 2017 : Java 8Geek Time Janvier 2017 : Java 8
Geek Time Janvier 2017 : Java 8
OLBATI287 vues
Design Pattern introduction par neuros
Design Pattern introductionDesign Pattern introduction
Design Pattern introduction
neuros3K vues
201305 - Lambda by R. Forax par lyonjug
201305 - Lambda by R. Forax201305 - Lambda by R. Forax
201305 - Lambda by R. Forax
lyonjug771 vues
Chapitre4 cours de java par info1994
Chapitre4 cours de javaChapitre4 cours de java
Chapitre4 cours de java
info19941.4K vues
Interface collectionsinter par RYMAA
Interface collectionsinterInterface collectionsinter
Interface collectionsinter
RYMAA1.3K vues
Eric Moreau: AOP in .Net sing PostSharp par MSDEVMTL
Eric Moreau: AOP in .Net sing PostSharpEric Moreau: AOP in .Net sing PostSharp
Eric Moreau: AOP in .Net sing PostSharp
MSDEVMTL520 vues
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018 par Loic Yon
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Loic Yon1.4K vues
chapitre5-Classesabstraitesetinterfaces.pdf par Moez Moezm
chapitre5-Classesabstraitesetinterfaces.pdfchapitre5-Classesabstraitesetinterfaces.pdf
chapitre5-Classesabstraitesetinterfaces.pdf
Moez Moezm38 vues
Devoxx France 2023 - Les nouveautés de Java 19 et 20 par Jean-Michel Doudoux
Devoxx France 2023 - Les nouveautés de Java 19 et 20Devoxx France 2023 - Les nouveautés de Java 19 et 20
Devoxx France 2023 - Les nouveautés de Java 19 et 20
System c eniso_jan_fev_07 par haythem_2015
System c eniso_jan_fev_07System c eniso_jan_fev_07
System c eniso_jan_fev_07
haythem_2015458 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
618 vues15 diapositives
Java 9 modules par
Java 9    modulesJava 9    modules
Java 9 modulesFranck SIMON
532 vues19 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
Description d'un fichier de prélèvements SEPA minimum par
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
29.1K vues8 diapositives
Tomcat and apache httpd training par
Tomcat and apache httpd trainingTomcat and apache httpd training
Tomcat and apache httpd trainingFranck SIMON
28K vues278 diapositives

Plus de Franck SIMON(16)

Distribuer une librairie via maven par Franck SIMON
Distribuer une librairie via mavenDistribuer une librairie via maven
Distribuer une librairie via maven
Franck SIMON618 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

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
MNGTCOUT PROJET 04112023.pptx par
MNGTCOUT PROJET 04112023.pptxMNGTCOUT PROJET 04112023.pptx
MNGTCOUT PROJET 04112023.pptxHAIDI2
5 vues56 diapositives
Newsletter SPW Agriculture en province du Luxembourg du 13-11-23 par
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-23BenotGeorges3
6 vues17 diapositives
Newsletter SPW Agriculture en province de LIEGE du 28-11-23 par
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-23BenotGeorges3
21 vues21 diapositives
Julia Margaret Cameron par
Julia Margaret CameronJulia Margaret Cameron
Julia Margaret CameronTxaruka
59 vues20 diapositives
La Lettre Formelle.pptx par
La Lettre Formelle.pptxLa Lettre Formelle.pptx
La Lettre Formelle.pptxstudymaterial91010
14 vues10 diapositives

Dernier(13)

MNGTCOUT PROJET 04112023.pptx par HAIDI2
MNGTCOUT PROJET 04112023.pptxMNGTCOUT PROJET 04112023.pptx
MNGTCOUT PROJET 04112023.pptx
HAIDI25 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
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
BenotGeorges321 vues
Julia Margaret Cameron par Txaruka
Julia Margaret CameronJulia Margaret Cameron
Julia Margaret Cameron
Txaruka59 vues
Présentation de lancement SAE105 par JeanLucHusson
Présentation de lancement SAE105Présentation de lancement SAE105
Présentation de lancement SAE105
JeanLucHusson19 vues
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 Formation6 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 (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...
BenotGeorges323 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 Formation5 vues

Java 8 - interfaces

  • 2. antislashn.org Java 8 - interfaces 2 / 34 Introduction ● Java 8 modifie le concept d'interface, en permettant à une interface d'avoir ● des méthodes statiques ● des méthodes par défaut ● une seule méthode abstraite, pour définir une interface fonctionnelle
  • 3. antislashn.org Java 8 - interfaces 3 / 34 Méthode statique ● Une interface peut recevoir des méthodes statiques ● une méthode statique ne peut pas être redéfinie dans une classe fille ● ne peut pas utiliser la référence this, puisque statique ● Les méthodes statiques d'interface ne peuvent être utilisées que sur l'interface ● par sur les classes implémentant l'interface ● classiquement, par le nom de l'interface
  • 4. antislashn.org Java 8 - interfaces 4 / 34 Méthode statique ● Permet de regrouper un ensemble de fonctionnalités dans une interface ● Améliore la sécurité, car les classes filles ne peuvent pas redéfinir la méthode statique ● Une méthode statique ne peut pas se substituer à une méthode de la classe Object ● erreur – "This static method cannot hide the instance method from Object"
  • 5. antislashn.org Java 8 - interfaces 5 / 34 Méthode statique ● Exemple public interface Foo { static boolean isNullOrEmpty(String str) { return str == null ? true : str.equals("") ? true : false; } }
  • 6. antislashn.org Java 8 - interfaces 6 / 34 Méthode par défaut ● Le qualificateur default marque une méthode par défaut ● la classe fille n'est pas obligée de fournir une implémentation ● this est utilisable dans la méthode par défaut – ce n'est pas une méthode statique
  • 7. antislashn.org Java 8 - interfaces 7 / 34 Méthode par défaut ● Exemple public interface Roulable { default void rouler(){ System.out.println("Objet pouvant rouler par défaut"); } } public class Ballon implements Roulable { } public class De implements Roulable { @Override public void rouler() { System.out.println("valeur obtenue : "+((int)(Math.random()*6)+1)); } }
  • 8. antislashn.org Java 8 - interfaces 8 / 34 Méthode par défaut ● Une première utilité des méthodes par défaut est l'intégration de nouvelles fonctionnalités sans avoir à intervenir sur le code existant ● assure la compatibilité avec le code déjà écrit pour l'ancienne version d'une interface
  • 9. antislashn.org Java 8 - interfaces 9 / 34 Méthode par défaut ● Permet d'implémenter le concept de trait en Java ● le trait, ou extension, encapsule un ensemble cohérent de méthodes ● ensemble de méthodes concrètes pouvant être ajoutée à une classe pour étendre ses fonctionnalités ● il est composé : – d'une méthode abstraite – des méthodes additionnelles implémentées par le trait et utilisant la méthode abstraite
  • 10. antislashn.org Java 8 - interfaces 10 / 34 Méthode par défaut ● Exemple de trait ● l'interface Java Comparable possède une méthode unique compareTo() – cette méthode renvoie un int ● il est intéressant sémantiquement d'avoir des méthodes telles que : – greaterThan() – lessThan() – isBefore() – isAfter() – isSame()
  • 11. antislashn.org Java 8 - interfaces 11 / 34 Méthode par défaut ● Exemple de trait ● les classes concrètes implémentant Orderable auront juste à définir la méthode compareTo(), héritée de Comparable public interface Odrderable<T> extends Comparable<T> { public default boolean isAfter(T other) { return compareTo(other) > 0; } public default boolean isBefore(T other) { return compareTo(other) < 0; } public default boolean isSameAs(T other) { return compareTo(other) == 0; } }
  • 12. antislashn.org Java 8 - interfaces 12 / 34 Méthode par défaut ● Que ce passe-t-il si deux interfaces possèdent une méthode par défaut ayant la même signature ? ● la classe qui implémente les deux interfaces doit fournir une implémentation de la méthode public interface InterfaceA { default void foo() { System.out.println("InterfaceA - foo()"); } } public interface InterfaceB { default void foo() { System.out.println("InterfaceB - foo()"); } } public class ABImpl implements InterfaceA, InterfaceB { }
  • 13. antislashn.org Java 8 - interfaces 13 / 34 Méthode par défaut ● Il suffit alors de fournir le code pour la méthode foo() ● exemples d'implémentation public class ABImpl implements InterfaceA, InterfaceB { @Override public void foo() { System.out.println("ABImpl - foo()"); } } public class ABImpl implements InterfaceA, InterfaceB { @Override public void foo() { InterfaceB.super.foo(); } }
  • 14. antislashn.org Java 8 - interfaces 14 / 34 Interface fonctionnelle ● Interface qui possède une seule méthode abstraite ● SAM : Single Abstract Method ● l'annotation @FunctionnalInterface permet au compilateur de vérifier que l'interface ne comporte qu'une seule méthode abstraite ● peut posséder des méthodes par défaut @FunctionalInterface public interface Operation { int compute(int x, int y); }
  • 15. antislashn.org Java 8 - interfaces 15 / 34 Interface fonctionnelle ● Objectif : définir une signature de méthode qui pourra être utilisée pour passer en paramètre : ● une référence vers une méthode statique ● une référence vers une méthode d'instance ● une référence vers un constructeur ● une expression lambda ● Un certains nombre d'interfaces fonctionnelles sont fournies par Java 8 dans le package java.util.function
  • 16. antislashn.org Java 8 - interfaces 16 / 34 Interface fonctionnelle ● Exemple d'interface fonctionnelle ● Exemple d'utilisation de l'interface @FunctionalInterface public interface Operation { int compute(int x, int y); } public class Calcul { public static int compute(int x, int y, Operation op){ return op.compute(x,y); } }
  • 17. antislashn.org Java 8 - interfaces 17 / 34 Interface fonctionnelle ● Classiquement, cette interface est implémentée par une classe ● utilisation public class Addition implements Operation { @Override public int compute(int x, int y) { return x+y; } } ... Operation op = new Addition(); int r = Calcul.compute(2, 2, op); ...
  • 18. antislashn.org Java 8 - interfaces 18 / 34 Interface fonctionnelle ● Ou passée comme classe anonyme ... r = Calcul.compute(5, 6, new Operation() { @Override public int compute(int x, int y) { return x-y; } }); ...
  • 19. antislashn.org Java 8 - interfaces 19 / 34 Interface fonctionnelle ● Exemple d'une interface de création ● retourne un objet fabriqué avec trois String ● Exemple de classe utilisant l'interface @FunctionalInterface public interface Creator<T> { T create(String str1, String str2, String str3); } public class ContactParser<T> { public T parse(String nomComplet, Creator<T> creator) { String[] items = nomComplet.split(" "); String civilite = items[0]; String nom = items[1]; String prenom = items[2]; return creator.create(civilite, nom, prenom); } }
  • 20. antislashn.org Java 8 - interfaces 20 / 34 Interface fonctionnelle ● Exemple de classe Contact (extrait) ● le constructeur prend 3 paramètres de type String public class Contact { private String civilite; private String nom; private String prenom; public Contact() {} public Contact(String civilite, String nom, String prenom) { this.civilite = civilite; this.nom = nom; this.prenom = prenom; } ... }
  • 21. antislashn.org Java 8 - interfaces 21 / 34 Interface fonctionnelle ● Réponse de Java 8 ● sans modification de l'existant nous pouvons passer toute méthode qui – accepte les mêmes types de paramètre ● 3 paramètres de type String – retourne le même type ● générique T
  • 22. antislashn.org Java 8 - interfaces 22 / 34 Interface fonctionnelle ● Avec Java 8, nous pouvons éviter la création d'une classe anonyme de type Creator<Contact> ● par une référence vers le constructeur de Contact – la syntaxe ::<method> définit une référence vers une méthode ● ici il y a bien un constructeur Contact(String,String, String) ContactParser<Contact> parser = new ContactParser<>(); Contact contact = parser.parse("M LAGAFFE Gaston", Contact::new); public class ContactParser<T> { public T parse(String nomComplet, Creator<T> creator) { ,,, return creator.create(civilite, nom, prenom); } }
  • 23. antislashn.org Java 8 - interfaces 23 / 34 Référence à une méthode ● Syntaxe permettant de référencer directement une méthode ou un constructeur ● opérateur :: ● référence à un constructeur par défaut – sans paramètre ● référence à une méthode – statique ou non System.out::println o -> System.out.println(o)est équivalent à
  • 24. antislashn.org Java 8 - interfaces 24 / 34 Référence à une méthode ● Exemples public class Voiture { public static Voiture create(final Supplier<Voiture> supplier){ return supplier.get(); } public void rouler(){ System.out.println("Rouler"); } } public static void main(String[] args) { List<Voiture> voitures = new ArrayList<>(); voitures.add(Voiture.create(Voiture::new)); voitures.add(Voiture.create(Voiture::new)); voitures.add(Voiture.create(Voiture::new)); voitures.forEach(Voiture::rouler); }
  • 25. antislashn.org Java 8 - interfaces 25 / 34 java.util.function ● Nombreuses interfaces fonctionnelles ● définies avec des types génériques ● Interfaces de base : ● Consumer – accepte un argument T et ne retourne pas de résultat ● Function – accepte un argument T et retourne un résultat R ● Supplier – ne prend pas d'argument et retourne un résultat T ● Predicate – test un valeur T et retourne un booléen
  • 26. antislashn.org Java 8 - interfaces 26 / 34 java.util.function.Consumer ● Abstraction d'une opération acceptant un seul argument et ne renvoyant aucun résultat ● méthodes – accept(T t) : exécute une opération sur le paramètre ● méthode abstraite – andThen(Consumer<? super T> after) : exécute l'opération accept puis l'opération accept sur after
  • 27. antislashn.org Java 8 - interfaces 27 / 34 java.util.function.Consumer ● Exemple List<String> types = new ArrayList<>(Arrays.asList("rock","trip hop","jazz","pop","rock")); List<String> result = new ArrayList<>(); Consumer<String> c1 = result::add; Consumer<String> c2 = System.out::println; Consumer<String> c3 = c1.andThen(c2); types.stream().forEach(c3); // BAD PATTERN (result::add) System.out.println(result);
  • 28. antislashn.org Java 8 - interfaces 28 / 34 java.util.function.Supplier ● Abstraction d'une fonction retournant une valeur ● le Supplier produit une valeur – abstraction d'un factory ● le Consumer consomme une valeur ● méthode – T get() : produit une valeur de type T ● méthode abstraite
  • 29. antislashn.org Java 8 - interfaces 29 / 34 java.util.function.Supplier ● Exemples Supplier<Point> pointSupplier = new Supplier<Point>(){ private int i = 0; @Override public Point get(){ i++; return new Point(i,i); } }; Point p1 = pointSupplier.get(); Point p2 = pointSupplier.get(); Supplier<Point> pointSupplier = Point::new; Point p1 = pointSupplier.get(); Point p2 = pointSupplier.get();
  • 30. antislashn.org Java 8 - interfaces 30 / 34 java.util.function.Function ● Abstraction d'une fonction acceptant un paramètre et retournant un résultat ● Function<T,R> : T argument, R résultat ● méthodes – R apply(T t) : applique la fonction à l'argument t – <T> Function<T,T> identity() : retourne toujours l'argument – <V> Function<R,V> andThen(Function<R,V> after) : retourne une fonction qui applique la fonction, puis applique after sur le résultat – <V> Function<V,R> compose(Function<V,T> before) : retourne une fonction qui applique before, puis applique la fonction sur le résultat de before
  • 31. antislashn.org Java 8 - interfaces 31 / 34 java.util.function.Function ● Exemple List<Point> points = new ArrayList<>(); initPoints(points); Function<Point,Integer> f1 = p -> p.getX(); Stream<Point> stream = points.stream(); Stream<Integer> xs = stream.map(f1); xs.forEach(System.out::println);
  • 32. antislashn.org Java 8 - interfaces 32 / 34 java.util.function.Predicate ● Abstraction d'un prédicat (fonction retournant true ou false) ● méthodes – test(T t) : évalue le prédicat sur t ● méthode abstraite – and(), or(), isEqual(), negate() : permet l'évaluation et le chaînage des prédicats
  • 33. antislashn.org Java 8 - interfaces 33 / 34 java.util.function.Predicate ● Exemple List<String> types = new ArrayList<>(Arrays.asList("rock","trip hop","jazz","pop","rock")); Predicate<String> p1 = s -> s.length() >3; Predicate<String> p2 = s -> s.length() <5; List<String> result = types.stream().filter(p1.and(p2)).collect(Collectors.toList()); System.out.println(result);
  • 34. antislashn.org Java 8 - interfaces 34 / 34 java.util.function ● Les interfaces de base servent à définir de nombreuses interfaces fonctionnelles sur les types de base ● IntConsumer ● LongToIntFunction ● DoubleSupplier ● cf. javadoc