Conception par Objet et Programmation Java

1/16
100%

<!-- Slide number: 1 -->

Conception par Objet et Programmation Java

1

![](GoogleShape215p1.jpg)

Chapitre 7 : les Interfaces en Java 8

Equipe Java

2019-2020

![](GoogleShape220p1.jpg)

Notes:

<!-- Slide number: 2 -->

Plan

‹#›

Introduction

Classe et objet

Encapsulation

Héritage

Polymorphisme

Exceptions

Interfaces

Collections

Lambda Expression

Stream

Notes:

<!-- Slide number: 3 -->

Objectifs

‹#›

Publicité

Les méthodes par défaut et les méthodes statiques.

Les interfaces Fonctionnelles

Notes:

<!-- Slide number: 4 -->

Les méthodes par défaut

‹#›

Parmi les nouveautés apportées par Java 8, on en trouve deux qui concernent les interfaces: les méthodes statiques et les méthodes par défaut.

Les méthodes statiques définies sur les interfaces fonctionnent exactement de la même façon que celles portées par les classes, il n'y a donc pas grand-chose à en dire. En revanche, les méthodes par défaut risquent de modifier assez profondément notre façon de concevoir nos API.

Notes:

<!-- Slide number: 5 -->

Les méthodes par défaut

‹#›

L’intérêt principal des méthodes par défaut est d’ajouter des nouvelles fonctionnalités aux interfaces tout en assurant la compatibilité avec les versions précédentes des JDK.

Exemple:

![](GoogleShape251p5.jpg)

Notes:

<!-- Slide number: 6 -->

Les méthodes par défaut

‹#›

L’interface Formule définit la méthode abstraite "calculer" la méthode par et défaut "sqrt". Classes concrètes n’ont qu'à implémenté la méthode abstraite calculer.

![](GoogleShape259p6.jpg)

Notes:

<!-- Slide number: 7 -->

Les méthodes par défaut

‹#›

L’interface formule est implémentée en tant qu'objet anonyme.

Publicité

Le code est assez verbeux: 6 lignes de code pour une simple calcule de "sqrt (a * 100)".

Dans les prochains chapitres nous présentons un moyen plus agréable d’implémentation d’interfaces qui possèdent une seule méthode abstraite (Single Abstract Method interface) en Java 8.

Notes:

<!-- Slide number: 8 -->

Les interfaces fonctionnelles

‹#›

Une interface fonctionnelle est une interface disposant une unique méthode abstraite. Le but est de définir la signature d’une 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.

Notes:

<!-- Slide number: 9 -->

Les interfaces fonctionnelles

‹#›

Une interface fonctionnelle pourra être annotée avec l’annotation @FunctionalInterface. Même si l'annotation @FunctionalInterface n’est pas obligatoire, elle a un rôle important permettant au compilateur de forcer l’interface afin qu’elle ne contienne qu’une seule méthode abstraite. Si nous essayons de définir plus d'une seule méthode abstraite dans une interface annotée avec @FunctionalInterface, le compilateur affichera une erreur.

![](GoogleShape281p9.jpg)

Notes:

<!-- Slide number: 10 -->

Les interfaces fonctionnelles les plus utilisées

‹#›

Le JDK 8 apporte par défaut plusieurs interfaces fonctionnelles, D’anciennes interfaces de l’API ont été migrées telles que "Comparable" et "Runnable".

Nous citons ci-dessous les interfaces les plus utilisées :

• Function

Une interface "Function" prend un argument et retourne un résultat dont la méthode fonctionnelle est "apply(Object)".

| @FunctionalInterface public interface Function<T,R> | T - le type d'entrée de la fonction R - le type du résultat de la fonction |

Publicité

| --- | --- |

Notes:

<!-- Slide number: 11 -->

Les interfaces fonctionnelles les plus utilisées

‹#›

• Supplier

L’interface "Supplier" produise un résultat d'un type donnée. Contrairement à l’interface "Function", "Supplier" n’accepte pas les arguments. La méthode abstraite de cette interface est "get()".

| @FunctionalInterface public interface Supplier<T> | T - Le type du résultat fournit par ce Supplier |

| --- | --- |

Notes:

<!-- Slide number: 12 -->

Les interfaces fonctionnelles les plus utilisées

‹#›

• Consumer

L’interface "Consumer" représente une opération qui accepte un seul argument et ne renvoie aucun résultat. La méthode abstraite de cette interface est "accept(Object)"

| @FunctionalInterface public interface Consumer<T> | T - le type d'entrée de la fonction |

| --- | --- |

Notes:

<!-- Slide number: 13 -->

Les interfaces fonctionnelles les plus utilisées

‹#›

• Predicate

L’interface "Predicate" représente une opération qui accepte un seul argument et renvoie un résultat de type "Boolean". La méthode abstraite de cette interface est "test(Object)".

| @FunctionalInterface public interface Predicate<T> | T - le type d'entrée de la fonction |

| --- | --- |

Notes:

Publicité

<!-- Slide number: 14 -->

Les interfaces fonctionnelles les plus utilisées

‹#›

• Comparator

L’interface "Comparator" est bien connue dans les anciennes versions du Java. C’est une fonction de comparaison, qui impose un ordre total sur certains objets de collection via sa méthode abstraite "compare(T o1, T o2)".

| @FunctionalInterface public interface Comparator<T> | T - le type d'objets qui peuvent être comparés par ce comparateur. |

| --- | --- |

Notes:

<!-- Slide number: 15 -->

Les interfaces fonctionnelles les plus utilisées

‹#›

• BiFunction

Représente une fonction qui accepte deux arguments et produit un résultat. C’est la spécialisation de deux arités de l’interface "Function". La méthode abstraite de cette interface est "apply(T t, U u)".

| @FunctionalInterface public interface BiFunction<T,U,R> | • T - le type du premier argument de la fonction • U - le type du deuxième argument de la fonction • R - le type du résultat de la fonction |

| --- | --- |

Notes:

<!-- Slide number: 16 -->

Les interfaces fonctionnelles les plus utilisées

‹#›

• UnaryOperator

Représente une opération sur un opérande unique qui produit un résultat du même type que son opérande. C’est une spécialisation de l’interface "Function" dans le cas où l'opérande et le résultat sont du même type. L’interface abstraite de cette interface est "apply(Object)".

| @FunctionalInterface public interface UnaryOperator<T> extends Function<T,T> | T - le type de l'opérande et du résultat de l'opération |

| --- | --- |

Notes:

Conception par Objet et Programmation Java

Programming · course

Voir tous les documents en programmation

<!-- Slide number: 1 -->

Conception par Objet et Programmation Java

1

![](GoogleShape215p1.jpg)

Chapitre 7 : les Interfaces en Java 8

Equipe Java

2019-2020

![](GoogleShape220p1.jpg)

Notes:

<!-- Slide number: 2 -->

Plan

‹#›

Introduction

Classe et objet

Encapsulation

Héritage

Polymorphisme

Exceptions

Interfaces

Collections

Lambda Expression

Stream

Notes:

<!-- Slide number: 3 -->

Objectifs

‹#›

Publicité

Les méthodes par défaut et les méthodes statiques.

Les interfaces Fonctionnelles

Notes:

<!-- Slide number: 4 -->

Les méthodes par défaut

‹#›

Parmi les nouveautés apportées par Java 8, on en trouve deux qui concernent les interfaces: les méthodes statiques et les méthodes par défaut.

Les méthodes statiques définies sur les interfaces fonctionnent exactement de la même façon que celles portées par les classes, il n'y a donc pas grand-chose à en dire. En revanche, les méthodes par défaut risquent de modifier assez profondément notre façon de concevoir nos API.

Notes:

<!-- Slide number: 5 -->

Les méthodes par défaut

‹#›

L’intérêt principal des méthodes par défaut est d’ajouter des nouvelles fonctionnalités aux interfaces tout en assurant la compatibilité avec les versions précédentes des JDK.

Exemple:

![](GoogleShape251p5.jpg)

Notes:

<!-- Slide number: 6 -->

Les méthodes par défaut

‹#›

L’interface Formule définit la méthode abstraite "calculer" la méthode par et défaut "sqrt". Classes concrètes n’ont qu'à implémenté la méthode abstraite calculer.

![](GoogleShape259p6.jpg)

Notes:

<!-- Slide number: 7 -->

Les méthodes par défaut

‹#›

L’interface formule est implémentée en tant qu'objet anonyme.

Publicité

Le code est assez verbeux: 6 lignes de code pour une simple calcule de "sqrt (a * 100)".

Dans les prochains chapitres nous présentons un moyen plus agréable d’implémentation d’interfaces qui possèdent une seule méthode abstraite (Single Abstract Method interface) en Java 8.

Notes:

<!-- Slide number: 8 -->

Les interfaces fonctionnelles

‹#›

Une interface fonctionnelle est une interface disposant une unique méthode abstraite. Le but est de définir la signature d’une 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.

Notes:

<!-- Slide number: 9 -->

Les interfaces fonctionnelles

‹#›

Une interface fonctionnelle pourra être annotée avec l’annotation @FunctionalInterface. Même si l'annotation @FunctionalInterface n’est pas obligatoire, elle a un rôle important permettant au compilateur de forcer l’interface afin qu’elle ne contienne qu’une seule méthode abstraite. Si nous essayons de définir plus d'une seule méthode abstraite dans une interface annotée avec @FunctionalInterface, le compilateur affichera une erreur.

![](GoogleShape281p9.jpg)

Notes:

<!-- Slide number: 10 -->

Les interfaces fonctionnelles les plus utilisées

‹#›

Le JDK 8 apporte par défaut plusieurs interfaces fonctionnelles, D’anciennes interfaces de l’API ont été migrées telles que "Comparable" et "Runnable".

Nous citons ci-dessous les interfaces les plus utilisées :

• Function

Une interface "Function" prend un argument et retourne un résultat dont la méthode fonctionnelle est "apply(Object)".

| @FunctionalInterface public interface Function<T,R> | T - le type d'entrée de la fonction R - le type du résultat de la fonction |

Publicité

| --- | --- |

Notes:

<!-- Slide number: 11 -->

Les interfaces fonctionnelles les plus utilisées

‹#›

• Supplier

L’interface "Supplier" produise un résultat d'un type donnée. Contrairement à l’interface "Function", "Supplier" n’accepte pas les arguments. La méthode abstraite de cette interface est "get()".

| @FunctionalInterface public interface Supplier<T> | T - Le type du résultat fournit par ce Supplier |

| --- | --- |

Notes:

<!-- Slide number: 12 -->

Les interfaces fonctionnelles les plus utilisées

‹#›

• Consumer

L’interface "Consumer" représente une opération qui accepte un seul argument et ne renvoie aucun résultat. La méthode abstraite de cette interface est "accept(Object)"

| @FunctionalInterface public interface Consumer<T> | T - le type d'entrée de la fonction |

| --- | --- |

Notes:

<!-- Slide number: 13 -->

Les interfaces fonctionnelles les plus utilisées

‹#›

• Predicate

L’interface "Predicate" représente une opération qui accepte un seul argument et renvoie un résultat de type "Boolean". La méthode abstraite de cette interface est "test(Object)".

| @FunctionalInterface public interface Predicate<T> | T - le type d'entrée de la fonction |

| --- | --- |

Notes:

Publicité

<!-- Slide number: 14 -->

Les interfaces fonctionnelles les plus utilisées

‹#›

• Comparator

L’interface "Comparator" est bien connue dans les anciennes versions du Java. C’est une fonction de comparaison, qui impose un ordre total sur certains objets de collection via sa méthode abstraite "compare(T o1, T o2)".

| @FunctionalInterface public interface Comparator<T> | T - le type d'objets qui peuvent être comparés par ce comparateur. |

| --- | --- |

Notes:

<!-- Slide number: 15 -->

Les interfaces fonctionnelles les plus utilisées

‹#›

• BiFunction

Représente une fonction qui accepte deux arguments et produit un résultat. C’est la spécialisation de deux arités de l’interface "Function". La méthode abstraite de cette interface est "apply(T t, U u)".

| @FunctionalInterface public interface BiFunction<T,U,R> | • T - le type du premier argument de la fonction • U - le type du deuxième argument de la fonction • R - le type du résultat de la fonction |

| --- | --- |

Notes:

<!-- Slide number: 16 -->

Les interfaces fonctionnelles les plus utilisées

‹#›

• UnaryOperator

Représente une opération sur un opérande unique qui produit un résultat du même type que son opérande. C’est une spécialisation de l’interface "Function" dans le cas où l'opérande et le résultat sont du même type. L’interface abstraite de cette interface est "apply(Object)".

| @FunctionalInterface public interface UnaryOperator<T> extends Function<T,T> | T - le type de l'opérande et du résultat de l'opération |

| --- | --- |

Notes: