devstory

Le Tutoriel de Java Functional Interface

  1. Functional Interface
  2. Examples
  3. Les Functional Interfaces courantes

1. Functional Interface

Functional Interface est un nouveau concept introduit dans Java depuis la version 8. C'est une interface avec une seule méthode abstraite. Les expressions Lambda sont souvent utilisées pour créer rapidement un objet de Functional Interface.
Voici une Functional Interface, avec une seule méthode abstraite:
package org.o7planning.ex;

public interface Greeting {

  String greeting(String name);
 
  default String hello(String name) {
      return "Hello " + name;
  }
}
Si une interface est conçue pour but d'une functional interface, vous devez utiliser l'annotation @FunctionalInterface pour l'annoter. Même si cette démarche n'est pas obligatoire, cela permet aux autres de mieux comprendre votre intention de conception. Cela aide également le compilateur à signaler vos erreurs au cours du développement de l'application. Par exemple, le compilateur signalera une erreur s'il y a une interface annotée par @FunctionalInterface mais celle-ci a plus d'une méthode abstraite.
package org.o7planning.ex;

@FunctionalInterface
public interface Greeting {

  String greeting(String name);
 
  default String hello(String name) {
      return "Hello " + name;
  }
}
Toujours concernant l'exemple ci-dessus. Avant Java 8, pour créer un objet Greeting, vous deviez créer une classe puis implémenter la méthode abstraite de Greeting, qui était assez longue et compliquée.
UsingGreetingBeforeJ8.java
package org.o7planning.ex;

public class UsingGreetingBeforeJ8 {

    public static void main(String[] args) {
        
        // Create Greeting object:
        Greeting obj = new Greeting() {
            @Override
            public String greeting(String name) {
                return "Hi " + name;
            }
        };
        
        System.out.println(obj.greeting("Tran"));
        System.out.println(obj.hello("Tran"));
    }
}
En règle générale, Functional Interface ne comprend qu'une seule méthode abstraite, vous n'avez donc qu'à implémenter cette méthode. L'expression Lambda de Java 8 vous aide à réécrire l'exemple précédent de manière plus concise.
UsingGreetingJ8A.java
package org.o7planning.ex;

public class UsingGreetingJ8A {

    public static void main(String[] args) {
        
        // Create Greeting object with Lambda expression:
        Greeting obj = (String name) -> {
            return "Hi " + name;
        };
        
        System.out.println(obj.greeting("Tran"));
        System.out.println(obj.hello("Tran"));
    }
}
Les types de données des paramètres de la méthode abstraite de Greeting sont connus, il n'est donc pas nécessaire de les réécrire. On peut réécrire l'exemple précédent de manière plus succincte:
Greeting obj = (name) -> {
    return "Hi " + name;
};
Si la méthode abstraite ne dispose que d'un seul paramètre, vous n'avez probablement pas besoin de parenthèses () dans l'expression Lambda:
Greeting obj = name -> {
    return "Hi " + name;
};
Si le contenu de la méthode se compose d'une seule expression, vous n'avez peut-être pas besoin d'accolades {} ni d'ajouter le mot-clé "return".
Greeting obj = name ->  "Hi " + name;
Enfin, le code de l'exemple ci-dessus est beaucoup plus court:
UsingGreetingJ8.java
package org.o7planning.ex;

public class UsingGreetingJ8 {

    public static void main(String[] args) {

        // Create Greeting object with Lambda expression:
        Greeting obj = name ->  "Hi " + name;

        System.out.println(obj.greeting("Tran"));
        System.out.println(obj.hello("Tran"));
    }
}
Output:
Hi Tran
Hello Tran

2. Examples

Ensuite, on observe certaine(s) Functional Interface(s), y compris celles valides et invalides, pour comprendre pourquoi elles ne sont pas valides:
L'interface IEquals suivante n'est pas une functional interface car la méthode "public boolean equals (Object)" est un membre hérité de la classe Object. Ainsi, IEquals est considéré comme n'ayant pas de méthodes abstraites et n'est pas éligible pour une functional interface.
IEquals.java (Invalid!)
package org.o7planning.j8fi;

@FunctionalInterface
public interface IEquals {
    
   boolean equals(Object other);
}
Valide:
IComparator.java (OK, Valid!)
package org.o7planning.j8fi;

@FunctionalInterface
public interface IComparator<T> {

    int compareTwoObject(T obj, T other);
    
    boolean equals(Object other);
}
La méthode clone() de la classe Object est protected (non public). Par conséquent, l'interface IWithClone suivante est considérée comme une functional interface valide.
IWithClone.java (OK, Valid)
package org.o7planning.j8fi;

@FunctionalInterface
public interface IWithClone {  
    
     Object clone();
}
L'interface CC dans l'illustration ci-dessus est une functional interface valide, car les méthodes abstraites dont elle hérite de AA et BB sont les mêmes.

3. Les Functional Interfaces courantes

Ci-dessous certaines functional interface les plus utilisées en Java:

Java Basic

Show More