Interface fonctionnelle Java 8

Java 8 新特性Nouveautés de 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

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 est un paramètre transmis à la méthode test de l'interface Predicate. //Si n existe, la méthode test renvoie 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 est un paramètre transmis à la méthode test de l'interface Predicate. //Si n%2 vaut 0, la méthode test renvoie true. System.out.println("Afficher tous les nombres pairs :"); eval(list, n-> n%2 == 0 ); // Predicate<Integer> predicate2 = n -> n > 3 //n est un paramètre transmis à la méthode test de l'interface Predicate. //Si n est supérieur à 3, la méthode test renvoie true. System.out.println("Afficher tous les nombres supérieurs à 3 :"); 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 + " "); } } } }

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 

Java 8 新特性Nouveautés de Java 8

Autres extensions