JavaRush /Java-Blog /Random-DE /Java-Funktionsschnittstellen
Алексей
Level 32

Java-Funktionsschnittstellen

Veröffentlicht in der Gruppe Random-DE
Eine funktionale Schnittstelle in Java ist eine Schnittstelle, die nur eine abstrakte Methode enthält. Der Hauptzweck besteht darin, es in Lambda-Ausdrücken und Methodenreferenzen zu verwenden.
Java-Funktionsschnittstellen - 1
Das Vorhandensein einer abstrakten Methode ist die einzige Bedingung, daher kann eine funktionale Schnittstelle auch defaultMethoden enthalten static. Sie können die Annotation @FunctionalInterface zu einer funktionalen Schnittstelle hinzufügen. Dies ist nicht erforderlich, aber wenn diese Annotation vorhanden ist, wird der Code nicht kompiliert, wenn mehr oder weniger als eine abstrakte Methode vorhanden ist. Es wird empfohlen, @FunctionalInterface hinzuzufügen. Dadurch können Sie die Schnittstelle in Lambda-Ausdrücken verwenden, ohne befürchten zu müssen, dass jemand der Schnittstelle eine neue abstrakte Methode hinzufügt und sie nicht mehr funktionsfähig ist. Java verfügt über integrierte Funktionsschnittstellen, die im java.util.function. Ich werde nicht näher darauf eingehen. Ich stelle fest, dass die am häufigsten verwendeten sind: Consumer<T> , Function<T,R> , Predicate<T> , Supplier<T> , UnaryOperator<T> und ihre Bi- Formen. Weitere Details finden Sie auf der Dokumentationsseite: Paket 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
    }
}
Es stellt sich jedoch heraus, dass in der Java-Sprachspezifikation ein subtiler Punkt beschrieben wird: „Schnittstellen erben nicht von Object, sondern deklarieren implizit viele der gleichen Methoden wie Object.“ Das bedeutet, dass funktionale Schnittstellen zusätzlich in der Klasse definierte abstrakte Methoden enthalten können Object. Der folgende Code ist gültig, es treten keine Kompilierungs- oder Laufzeitfehler auf:
@FunctionalInterface
public interface Comparator<T> {
   int compare(T o1, T o2);
   boolean equals(Object obj);
   // другие default oder static методы
}
Seien Sie beim Vorstellungsgespräch vorsichtig! Viel Glück!
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION