Le Tutoriel de Java Functional Interface
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.
Java Basic
- Personnaliser le compilateur Java pour traiter votre annotation (Annotation Processing Tool)
- Programmation Java pour l'équipe utilisant Eclipse et SVN
- Le Tutoriel de Java WeakReference
- Le Tutoriel de Java PhantomReference
- Tutoriel sur la compression et la décompression Java
- Configuration d'Eclipse pour utiliser le JDK au lieu de JRE
- Méthodes Java String.format() et printf()
- Syntaxe et nouvelles fonctionnalités de Java 8
- Expression régulière en Java
- Tutoriel de programmation Java multithreading
- Bibliothèques de pilotes JDBC pour différents types de bases de données en Java
- Tutoriel Java JDBC
- Obtenir des valeurs de colonne automatiquement incrémentées lors de l'insertion d'un enregistrement à l'aide de JDBC
- Le Tutoriel de Java Stream
- Le Tutoriel de Java Functional Interface
- Introduction à Raspberry Pi
- Le Tutoriel de Java Predicate
- Classe abstraite et interface en Java
- Modificateurs d'accès en Java
- Le Tutoriel de Java Enum
- Le Tutoriel de Java Annotation
- Comparer et trier en Java
- Le Tutoriel de Java String, StringBuffer et StringBuilder
- Tutoriel de gestion des exceptions Java
- Le Tutoriel de Java Generics
- Manipulation de fichiers et de répertoires en Java
- Le Tutoriel de Java BiPredicate
- Le Tutoriel de Java Consumer
- Le Tutoriel de Java BiConsumer
- Qu'est-ce qui est nécessaire pour commencer avec Java?
- L'histoire de Java et la différence entre Oracle JDK et OpenJDK
- Installer Java sur Windows
- Installer Java sur Ubuntu
- Installer OpenJDK sur Ubuntu
- Installer Eclipse
- Installer Eclipse sur Ubuntu
- Le Tutoriel Java pour débutant
- Histoire des bits et des bytes en informatique
- Types de données dans Java
- Opérations sur les bits
- Le Tutoriel de instruction Java If else
- Le Tutoriel de instruction Java Switch
- Les Boucles en Java
- Les Tableaux (Array) en Java
- JDK Javadoc au format CHM
- Héritage et polymorphisme en Java
- Le Tutoriel de Java Function
- Le Tutoriel de Java BiFunction
- Exemple de Java encoding et decoding utilisant Apache Base64
- Le Tutoriel de Java Reflection
- Invocation de méthode à distance en Java
- Le Tutoriel de Java Socket
- Quelle plate-forme devez-vous choisir pour développer des applications de bureau Java?
- Le Tutoriel de Java Commons IO
- Le Tutoriel de Java Commons Email
- Le Tutoriel de Java Commons Logging
- Comprendre Java System.identityHashCode, Object.hashCode et Object.equals
- Le Tutoriel de Java SoftReference
- Le Tutoriel de Java Supplier
- Programmation orientée aspect Java avec AspectJ (AOP)
Show More
- Tutoriels de programmation Java Servlet/JSP
- Tutoriels de Java Collections Framework
- Tutoriels Java API pour HTML & XML
- Tutoriels Java IO
- Tutoriels Java Date Time
- Tutoriels Spring Boot
- Tutoriels Maven
- Tutoriels Gradle
- Tutoriels Java Web Service
- Tutoriels de programmation Java SWT
- Tutoriels de JavaFX
- Tutoriels Java Oracle ADF
- Tutoriels Struts2
- Tutoriels Spring Cloud