Une interface fonctionnelle en Java est une interface qui ne contient qu'une seule méthode abstraite. L'objectif principal est de l'utiliser dans les expressions lambda et les références de méthodes.
La présence d'une méthode abstraite est la seule condition, donc une interface fonctionnelle peut également contenir
Je ne m'y attarderai pas en détail. Je note que les plus fréquemment utilisés sont : Consumer<T> , Function<T,R> , Predicate<T> , Supplier<T> , UnaryOperator<T> et leurs formes Bi . Plus de détails peuvent être trouvés sur la page de documentation : Package java.util.function
default
des méthodes static
. Vous pouvez ajouter l'annotation @FunctionalInterface à une interface fonctionnelle. Ce n'est pas obligatoire, mais si cette annotation est présente, le code ne sera pas compilé s'il y a plus ou moins d'une méthode abstraite. Il est recommandé d'ajouter @FunctionalInterface. Cela vous permettra d'utiliser l'interface dans des expressions lambda sans craindre que quelqu'un ajoute une nouvelle méthode abstraite à l'interface et qu'elle cesse d'être fonctionnelle. Java possède des interfaces fonctionnelles intégrées hébergées dans le java.util.function
.
Que lire d'autre : |
---|
import java.util.function.Predicate;
//Определяем свой функциональный интерфейс
@FunctionalInterface
interface MyPredicate {
boolean test(Integer value);
}
public class Tester {
public static void main(String[] args) throws Exception {
MyPredicate myPredicate = x -> x > 0;
System.out.println(myPredicate.test(10)); //true
//Аналогично, но используется встроенный функциональный интерфейс java.util.function.Predicate
Predicate<Integer> predicate = x -> x > 0;
System.out.println(predicate.test(-10)); //false
}
}
Mais il s'avère qu'il y a un point subtil décrit dans la spécification du langage Java : "les interfaces n'héritent pas d'Object, mais déclarent plutôt implicitement bon nombre des mêmes méthodes que Object". Cela signifie que les interfaces fonctionnelles peuvent en outre contenir des méthodes abstraites définies dans la classe Object
. Le code ci-dessous est valide, il n'y aura aucune erreur de compilation ou d'exécution :
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
// другие default or static методы
}
Soyez prudent lors de l'entretien ! Bonne chance!
GO TO FULL VERSION