Bitte trollen Sie nicht zu viel, ich fange gerade erst an, Artikel zu übersetzen
Eine Schnittstelle kann von einer anderen Schnittstelle erben; wenn die Schnittstelle von einer funktionalen Schnittstelle erbt und keine neuen abstrakten Methoden enthält, dann ist diese Schnittstelle ebenfalls funktionsfähig. Eine Schnittstelle kann jedoch nur eine abstrakte Methode und viele Standardmethoden enthalten und wird dennoch als funktionsfähig betrachtet.
Einführung in funktionale Schnittstellen – in Java 8 neu erstellte Konzepte
Jeder Java-Entwickler auf der Welt hat mindestens einmal eine der folgenden Schnittstellen verwendet:java.lang.Runnable
, java.awt.event.ActionListener
, java.util.Comparator
, java.util.concurrent.Callable
. Eines haben sie alle gemeinsam: Sie haben alle nur eine Methode. Es gibt viele weitere solcher Schnittstellen im JDK sowie andere, die von Java-Entwicklern erstellt wurden. Single Abstract Method interfaces
Diese Schnittstellen werden auch als (SAM-Schnittstellen) bezeichnet . Eine der beliebtesten Möglichkeiten, diese Schnittstellen zu verwenden, besteht darin, anonyme innere Klassen zu erstellen, die diese Schnittstellen verwenden, wie im folgenden Beispiel:
public class AnonymousInnerClassTest {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("A thread created and running...");
}
}).start();
}
}
In Java 8 wird das SAM-Konzept neu erstellt und als funktionale Schnittstellen bezeichnet. Sie können mithilfe von Lambda-Ausdrücken, Methodenreferenzen und Referenzkonstruktoren dargestellt werden. Es wurde eine neue @FunctionalInterface-Annotation erstellt, die verwendet wird, um Fehler auf Compilerebene auszulösen, wenn die von Ihnen annotierte Schnittstelle auf Funktionsebene nicht funktioniert. Schauen wir uns eine einfache funktionale Schnittstelle mit einer abstrakten Methode an:
@FunctionalInterface
public interface SimpleFunInterface {
public void doWork();
}
Eine Schnittstelle kann auch abstrakte Methoden einer Klasse deklarieren java.lang.Object
, in diesem Fall kann die Schnittstelle jedoch auch als funktional deklariert werden:
@FunctionalInterface
public interface SimpleFuncInterface {
public void doWork();
public String toString();
public Boolean equals(Object o);
}
Sobald Sie der Schnittstelle eine weitere abstrakte Methode hinzugefügt haben, markiert die IDE diese als fehlerhaft wie im Bild:
Was gibt es sonst noch zu lesen: |
---|
@FunctionalInterface
public interface ComplexFunctionalInterface extends SimpleFuncInterface {
default public void doSomeWork() {
System.out.println("Doing some work in interface impl...");
}
default public void doSomeWork() {
System.out.println("Doing some other work in interface impl...");
}
}
Das Top-Beispiel ist immer noch eine funktionale Schnittstelle. Schauen wir uns nun an, wie wir Lambda-Ausdrücke verwenden können, um eine anonyme innere Klasse zu ersetzen und funktionale Schnittstellen zu implementieren:
/*
*Implementation the interface by creating an
*anonymoous inner class versus using
*lambda expression.
*/
public class SimpleFunInterfaceTest {
public static void main(String[] args) {
carryOutWork(new SimpleFunInterface() {
@Override
public void doWork() {
System.out.println("Do work in SimpleFun impl...");
}
});
carryOutWork(() -> System.out.println("Do work in lambda exp impl..."));
}
public static void carryOutWork(SimpleFuncInterface sfi) {
sfi.work();
}
}
Das Ergebnis des Programms wird wie folgt sein:
Do work in SimpleFun impl...
Do work in lambda exp impl...
Falls Sie eine IDE verwenden, die die Java-Lambda-Ausdruckssyntax unterstützt (Netbeans 8 Nightly-Builds), erhalten Sie einen Hinweis zur Verwendung anonymer innerer Klassen: Dies war eine kurze Einführung in das Konzept der funktionalen Schnittstellen in Java 8 und wie diese implementiert werden können Verwendung von Lambda-Ausdrücken.
GO TO FULL VERSION