English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Une interface fonctionnelle (Functional Interface) est une interface qui possède une et une seule méthode abstraite, mais peut en avoir plusieurs non abstraites.
Les interfaces fonctionnelles peuvent être implicitement converties en expressions Lambda.
Les expressions Lambda et les appels de méthode (qui peuvent également être considérés comme des expressions Lambda) .
Par exemple, une interface fonctionnelle pourrait être définie comme suit :
@FunctionalInterface interface GreetingService { void sayMessage(String message); }
Alors, vous pouvez utiliser l'expression Lambda pour représenter une implémentation de cette interface (note : JAVA 8 Auparavant, cela était généralement réalisé à l'aide d'une classe anonyme) :
GreetingService greetService1 message -> System.out.println("Hello ") + message);
les interfaces fonctionnelles peuvent offrir un soutien amical aux fonctions existantes.
JDK 1.8 interfaces fonctionnelles existantes avant :
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
JDK 1.8 nouvelles interfaces de fonction ajoutées :
java.util.function
java.util.function contient de nombreux classes, pour soutenir le programmation fonctionnelle Java, les interfaces fonctionnelles dans ce paquet incluent :
numéro | interface & description |
---|---|
1 | BiConsumer<T,U> représente une opération qui accepte deux paramètres d'entrée et ne renvoie rien |
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érateurs de même type et renvoie un résultat du même type que les opérateurs |
4 | BiPredicate<T,U> représente une méthode booleane avec deux paramètres |
5 | BooleanSupplier représente le fournisseur d'un résultat boolean |
6 | Consumer<T> représente une opération qui accepte un paramètre d'entrée et ne renvoie rien. |
7 | DoubleBinaryOperator représente une opération sur deux opérateurs de valeur double et renvoie un résultat de valeur double. |
8 | DoubleConsumer représente une opération qui accepte une valeur double en paramètre et ne renvoie pas de résultat. |
9 | DoubleFunction<R> représente une méthode qui accepte une valeur double en paramètre et renvoie un résultat |
10 | DoublePredicate représente une méthode booleane avec un paramètre de valeur double |
11 | DoubleSupplier représente le fournisseur d'une structure de valeur double |
12 | DoubleToIntFunction Accepte une entrée de type double et retourne un résultat de type int. |
13 | DoubleToLongFunction Accepte une entrée de type double et retourne un résultat de type long |
14 | DoubleUnaryOperator Accepte un paramètre de type double et le type de retour est également de type double. |
15 | Function<T,R> Accepte un paramètre d'entrée et retourne un résultat. |
16 | IntBinaryOperator Accepte deux paramètres de type int, et le type de retour est également de type int. |
17 | IntConsumer Accepte un paramètre d'entrée de type int, sans valeur de retour. |
18 | IntFunction<R> Accepte un paramètre d'entrée de type int et retourne un résultat. |
19 | IntPredicate Accepte un paramètre d'entrée de type int et retourne un résultat de type booléen. |
20 | IntSupplier Sans paramètres, retourne un résultat de type int. |
21 | IntToDoubleFunction Accepte une entrée de type int et retourne un résultat de type double. |
22 | IntToLongFunction Accepte une entrée de type int et retourne un résultat de type long. |
23 | IntUnaryOperator Accepte un paramètre de type int et le type de retour est également de type int. |
24 | LongBinaryOperator Accepte deux paramètres de type long, et le type de retour est également de type long. |
25 | LongConsumer Accepte un paramètre d'entrée de type long, sans valeur de retour. |
26 | LongFunction<R> Accepte un paramètre d'entrée de type long et retourne un résultat. |
27 | LongPredicate R accepte un paramètre d'entrée de type long et retourne un résultat de type booléen. |
28 | LongSupplier Sans paramètres, retourne une valeur de type long. |
29 | LongToDoubleFunction Accepte une entrée de type long et retourne un résultat de type double. |
30 | LongToIntFunction Accepte une entrée de type long et retourne un résultat de type int. |
31 | LongUnaryOperator Accepte un paramètre de type long et retourne une valeur de type long. |
32 | ObjDoubleConsumer<T> Accepte une entrée de type object et un paramètre de type double, sans valeur de retour. |
33 | ObjIntConsumer<T> Accepte une entrée de type object et un paramètre de type int, sans valeur de retour. |
34 | ObjLongConsumer<T> Accepte un paramètre d'entrée de type object et un paramètre de type long, sans retourner de valeur. |
35 | Predicate<T> Accepte un paramètre d'entrée, retourne un résultat de type boolean. |
36 | Supplier<T> Sans paramètres, retourne un résultat. |
37 | ToDoubleBiFunction<T,U> Accepte deux paramètres d'entrée, retourne un résultat de type double. |
38 | ToDoubleFunction<T> Accepte un paramètre d'entrée, retourne un résultat de type double. |
39 | ToIntBiFunction<T,U> Accepte deux paramètres d'entrée, retourne un résultat de type int. |
40 | ToIntFunction<T> Accepte un paramètre d'entrée, retourne un résultat de type int. |
41 | ToLongBiFunction<T,U> Accepte deux paramètres d'entrée, retourne un résultat de type long. |
42 | ToLongFunction<T> Accepte un paramètre d'entrée, retourne un résultat de type long. |
43 | UnaryOperator<T> Accepte un paramètre de type T, le type de retour est également T. |
L'interface Predicate <T> est une interface fonctionnelle qui accepte un paramètre d'entrée T et retourne un résultat de type boolean.
Cette interface contient plusieurs méthodes par défaut pour combiner Predicate en d'autres logiques complexes (par exemple : ET, OU, NON).
Cette interface est utilisée pour tester si un objet est true ou false.
Nous pouvons le voir à travers les exemples suivants (Java8Pour comprendre l'utilisation de l'interface fonctionnelle Predicate <T> dans Tester.java):
import java.util.Arrays; import java.util.List; import java.util.function.Predicate; public class Java8Tester { public static void main(String args[]){ List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); // Predicate<Integer> predicate = n ->true // n is a parameter passed to the test method of the Predicate interface // Si n existe, le méthode test retourne true System.out.println("Afficher toutes les données:"); // Passer le paramètre n eval(list, n->true); // Predicate<Integer> predicate1 = n -> n%2 == 0 // n is a parameter passed to the test method of the Predicate interface // Si n%2 Pour 0, le méthode test retourne true System.out.println("Afficher tous les nombres pairs:"); eval(list, n-> n%2 == 0 ); // Predicate<Integer> predicate2 = n -> n > 3 // n is a parameter passed to the test method of the Predicate interface // If n is greater than 3 test method returns true System.out.println("Output greater than 3 All numbers:"); eval(list, n-> n > 3 ); } public static void eval(List<Integer> list, Predicate<Integer> predicate) { for(Integer n: list) { if(predicate.test(n)) { System.out.println(n + " "); } } } }
Execute the above script, the output result is:
$ javac Java8Tester.java $ java Java8Tester Output all data: 1 2 3 4 5 6 7 8 9 Output all even numbers: 2 4 6 8 Output greater than 3 All numbers of: 4 5 6 7 8 9