JavaRush /Blog Java /Random-FR /Interfaces fonctionnelles Java
Алексей
Niveau 32

Interfaces fonctionnelles Java

Publié dans le groupe Random-FR
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.
Interfaces fonctionnelles Java - 1
La présence d'une méthode abstraite est la seule condition, donc une interface fonctionnelle peut également contenir defaultdes 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. 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

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!
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION