Interfaces fonctionnelles ont une seule fonctionnalité à présenter. Par exemple, une interface Comparable dotée d'une seule méthode "compareTo" est utilisée à des fins de comparaison. Java 8 a défini un grand nombre d'interfaces fonctionnelles à utiliser largement dans les expressions lambda .
Il y a une annotation introduite- @FunctionalInterface
qui peut être utilisé pour les erreurs au niveau du compilateur lorsque l'interface que vous avez annotée n'est pas une interface fonctionnelle valide.
@FunctionalInterface
interface MathOperation {
int operation(int a, int b);
}
Essayons d'ajouter une autre méthode abstraite :
@FunctionalInterface
interface MathOperation {
int operation(int a, int b);
int operationMultiply(int a, int b);
}
Le résultat ci-dessus sera une erreur de compilation comme indiqué ci-dessous :
Unexpected @FunctionalInterface annotation
@FunctionalInterface ^ MathOperation is not a functional interface
multiple non-overriding abstract methods found in interface MathOperation
Une interface fonctionnelle est valide même si le @FunctionalInterface
l'annotation serait omise. Elle sert uniquement à informer le compilateur de l'application d'une méthode abstraite unique à l'intérieur de l'interface.
interface MathOperation {
int operation(int a, int b);
}
Conceptuellement, une interface fonctionnelle possède exactement une méthode abstraite. Comme les méthodes par défaut ont une implémentation, elles ne sont pas abstraites. Puisque les méthodes par défaut ne sont pas abstraites, vous Vous êtes libre d'ajouter autant de méthodes par défaut que vous le souhaitez à votre interface fonctionnelle.
Vous trouverez ci-dessous une interface fonctionnelle valide :
@FunctionalInterface
interface MathOperation {
int operation(int a, int b);
default void doSomeMathOperation(){
//Method body
}
}
Si une interface déclare un méthode abstraite surchargeant une des méthodes publiques de java.lang.Object, qui ne compte pas non plus. vers le nombre de méthodes abstraites de l'interface puisque toute implémentation de l'interface aura une implémentation de java.lang.Object ou autre.
Par exemple, l'interface ci-dessous est une interface fonctionnelle valide même si elle déclare deux méthodes abstraites. Pourquoi ? Parce que l'une de ces méthodes abstraites "equals()" a une signature égale à la méthode publique de la classe Object.
@FunctionalInterface
interface MathOperation {
int operation(int a, int b);
@Override
public String toString(); //Overridden from Object class
@Override
public boolean equals(Object obj); //Overridden from Object class
}
Bien que l'utilisation prévue de Interfaces fonctionnelles est pour expressions lambda , références aux méthodes y références du constructeur mais elles peuvent toujours être utilisées, comme toute interface, avec des classes anonymes, implémentées par des classes, ou créées par des méthodes de fabrique.
1 votes
Il ressemble à ce lien. Ils expliquent également pourquoi il ne devrait y avoir qu'une seule méthode dans une interface fonctionnelle. stackoverflow.com/questions/33010594/
1 votes
@KulbhushanSingh J'ai vu cette question avant de la poster... Les deux questions sentent la différence...