Interface fonctionnelle Java 8
Une interface fonctionnelle (Functional Interface) est une interface qui a exactement une méthode abstraite, mais peut avoir plusieurs méthodes non abstraites.
Les interfaces fonctionnelles peuvent être implicitement converties en expressions lambda.
Les expressions lambda et les références de méthode (qui peuvent en fait aussi être considérées comme des expressions lambda).
Par exemple, définissez une interface fonctionnelle comme suit :
@FunctionalInterface
interface GreetingService
{
void sayMessage(String message);
}
Vous pouvez alors utiliser une expression lambda pour représenter une implémentation de l’interface (Remarque : avant Java 8, on l’implémentait généralement avec des classes anonymes) :
GreetingService greetService1 = message -> System.out.println("Hello " + message);
Les interfaces fonctionnelles peuvent prendre en charge lambda de manière conviviale pour les fonctions existantes.
Interfaces fonctionnelles qui existaient avant JDK 1.8 :
- java.lang.Runnable
- java.util.concurrent.Callable
- java.security.PrivilegedAction
- java.util.Comparator
- java.io.FileFilter
- java.nio.file.PathMatcher
- java.lang.reflect.InvocationHandler
- java.beans.PropertyChangeListener
- java.awt.event.ActionListener
- javax.swing.event.ChangeListener
Interfaces fonctionnelles nouvellement ajoutées dans JDK 1.8 :
- java.util.function
java.util.function contient de nombreuses classes pour prendre en charge la programmation fonctionnelle en Java. Les interfaces fonctionnelles de ce package incluent :
| Non. | Interface et Description |
|---|---|
| 1 | BiConsumer<T,U>
Représente une opération qui accepte deux paramètres d'entrée et ne renvoie aucun résultat. |
| 2 | BiFunction<T,U,R>
Représente une méthode qui accepte deux paramètres d'entrée et renvoie un résultat. |
| 3 | BinaryOperator<T>
Représente une opération sur deux opérandes de même type, et renvoie un résultat du même type que les opérandes. |
| 4 | BiPredicate<T,U>
Représente une méthode à valeur booléenne avec deux paramètres. |
| 5 | BooleanSupplier
Représente un fournisseur d'un résultat booléen. |
| 6 | Consumer<T>
Représente une opération qui accepte un paramètre d'entrée et ne renvoie aucun résultat. |
| 7 | DoubleBinaryOperator
Représente une opération sur deux opérandes de type double et renvoie un résultat de type double. |
| 8 | DoubleConsumer
Représente une opération qui accepte un paramètre de type double et ne renvoie aucun résultat. |
| 9 | DoubleFunction<R>
Représente une méthode qui accepte un paramètre de type double et renvoie un résultat. |
| 10 | DoublePredicate
Représente une méthode à valeur booléenne avec un paramètre de type double. |
| 11 | DoubleSupplier
Représente un fournisseur d'un résultat de type double. |
| 12 | DoubleToIntFunction
Accepte une entrée de type double et renvoie un résultat de type int. |
| 13 | DoubleToLongFunction
Accepte une entrée de type double et renvoie un résultat de type long. |
| 14 | DoubleUnaryOperator
Accepte un paramètre de type double, et le type de la valeur de retour est également double. |
| 15 | Function<T,R>
Accepte un paramètre d'entrée et renvoie un résultat. |
| 16 | IntBinaryOperator
Accepte deux paramètres de type int, et le type de retour est également int. |
| 17 | IntConsumer
Accepte un paramètre d'entrée de type int, aucune valeur de retour. |
| 18 | IntFunction<R>
Accepte un paramètre d'entrée de type int et renvoie un résultat. |
| 19 | IntPredicate
Accepte un paramètre d'entrée de type int et renvoie un résultat boolean. |
| 20 | IntSupplier
Aucun paramètre, renvoie un résultat de type int. |
| 21 | IntToDoubleFunction
Accepte une entrée de type int et renvoie un résultat de type double. |
| 22 | IntToLongFunction
Accepte une entrée de type int et renvoie un résultat de type long. |
| 23 | IntUnaryOperator
Accepte un paramètre de type int, et le type de la valeur de retour est également int. |
| 24 | LongBinaryOperator
Accepte deux paramètres tous deux de type long, et le type de la valeur de retour est également long. |
| 25 | LongConsumer
Accepte un paramètre d'entrée de type long, aucune valeur de retour. |
| 26 | LongFunction<R>
Accepte un paramètre d'entrée de type long et renvoie un résultat. |
| 27 | LongPredicate
R accepte un paramètre d'entrée long et renvoie un résultat de type boolean. |
| 28 | LongSupplier
Aucun paramètre, renvoie une valeur de type long. |
| 29 | LongToDoubleFunction
Accepte une entrée de type long et renvoie un résultat de type double. |
| 30 | LongToIntFunction
Accepte une entrée de type long et renvoie un résultat de type int. |
| 31 | LongUnaryOperator
Accepte un paramètre de type long, et le type de la valeur de retour est également long. |
| 32 | ObjDoubleConsumer<T>
Accepte un paramètre d'entrée de type Object et un paramètre d'entrée de type double, aucune valeur de retour. |
| 33 | ObjIntConsumer<T>
Accepte un paramètre d'entrée de type Object et un paramètre d'entrée de type int, aucune valeur de retour. |
| 34 | ObjLongConsumer<T>
Accepte un paramètre d'entrée de type Object et un paramètre d'entrée de type long, aucune valeur de retour. |
| 35 | Predicate<T>
Accepte un paramètre d'entrée et renvoie un résultat de type boolean. |
| 36 | Supplier<T>
Aucun paramètre, renvoie un résultat. |
| 37 | ToDoubleBiFunction<T,U>
Accepte deux paramètres d'entrée et renvoie un résultat de type double. |
| 38 | ToDoubleFunction<T>
Accepte un paramètre d'entrée et renvoie un résultat de type double. |
| 39 | ToIntBiFunction<T,U>
Accepte deux paramètres d'entrée et renvoie un résultat de type int. |
| 40 | ToIntFunction<T>
Accepte un paramètre d'entrée et renvoie un résultat de type int. |
| 41 | ToLongBiFunction<T,U>
Accepte deux paramètres d'entrée et renvoie un résultat de type long. |
| 42 | ToLongFunction<T>
Accepte un paramètre d'entrée et renvoie un résultat de type long. |
| 43 | UnaryOperator<T>
Accepte un paramètre de type T, et le type de la valeur de retour est également T. |
Exemple d'interface fonctionnelle
L'interface Predicate<T> est une interface fonctionnelle qui accepte un paramètre d'entrée T et renvoie un résultat booléen.
Cette interface contient diverses méthodes par défaut pour combiner des Predicates en une autre logique complexe (telles que : AND, OR, NOT).
Cette interface est utilisée pour tester si un objet est vrai ou faux.
Nous pouvons découvrir l'utilisation de l'interface fonctionnelle Predicate<T> à travers l'exemple suivant (Java8Tester.java) :
Fichier Java8Tester.java
Exécutez le script ci-dessus, et le résultat de sortie est :
$ javac Java8Tester.java $ java Java8Tester 输出所有数据: 1 2 3 4 5 6 7 8 9 输出所有偶数: 2 4 6 8 输出大于 3 的所有数字: 4 5 6 7 8 9
Autres extensions
Nouveautés de Java 8