Java 8 – Funktionale Schnittstellen

Was sind funktionale Schnittstellen?

Funktionale Schnittstellen sind Schnittstellen mit einer einzigen abstrakten Methode. Gemäß der Java 8-Spezifikation kann eine Schnittstelle als funktionale Schnittstelle bezeichnet werden, wenn es eine einzelne Methode gibt, die den folgenden Regeln entspricht:

  • Wenn eine Schnittstelle über eine einzige abstrakte Methode verfügt, wird sie als funktionale Schnittstelle bezeichnet.
  • Eine funktionale Schnittstelle kann beliebig viele haben Standardmethoden mit einer einzigen abstrakten Methode. Standardmethoden sind Methodendeklarationen innerhalb von Schnittstellen mit dem Schlüsselwort „default“. Dies ist eine der neuen Funktionen von Java 8.
  • Wenn eine Schnittstelle eine andere funktionale Schnittstelle erweitert und darin keine anderen Methoden deklariert, wird sie als funktionale Schnittstelle betrachtet, da sie eine einzelne abstrakte Methode von der übergeordneten Schnittstelle erbt.
  • @FunctionalInterface Annotation, die vom Compiler verwendet wird, um zu erkennen, ob eine Schnittstelle eine gültige funktionale Schnittstelle ist. Es ist nicht zwingend erforderlich, die Annotation @FunctionalInterface zu verwenden, um eine funktionale Schnittstelle anzugeben.
  • Zusätzlich zur einzelnen abstrakten Methode kann jede beliebige Methode in der Object-Klasse als abstrakt deklariert werden und ist dennoch eine gültige funktionale Schnittstelle.
  • Diese Schnittstellen wurden früher als Single Abstract Method Interfaces (SAMI) bezeichnet.
  • Einige Beispiele für die Funktionsschnittstellen sind java.lang.Runnable, java.awt.event.ActionListener, java.util.Comparator, java.util.concurrent.Callable

Beispiele für funktionale Schnittstellen

  • Was sind funktionale Schnittstellen und funktionale Deskriptoren?
  • Lambda-Ausdrücke in Java 8

Schauen wir uns einige Beispiele an, die Teil der Java-API sind.

Runnable und Comparator interfaces ist ein Beispiel für die funktionale Schnittstelle.

interface Runnable {
        void run();
}

Comparator.java

interface Comparator<T> {
        boolean equals(Object obj);
        int compare(T o1, T o2);
}

Schauen wir uns die folgenden benutzerdefinierten Schnittstellen mit der funktionalen Schnittstellensemantik an.

Deployable.java

package net.javabeat;
public interface Deployable {
	boolean someWork(Iterable<String> arg);
}

Integrateable.java

package net.javabeat;

public interface Integrateable {
	boolean someWork(Iterable<String> arg);
}

Useable.java

package net.javabeat;
@FunctionalInterface
public interface Useable extends Deployable, Integrateable{
}
  • Verwendbar ist eine funktionale Schnittstelle, da sie zwei Methoden von Deployable und Integrateable erbt. Wenn Sie sich beide Schnittstellen ansehen, haben die Methoden dieselbe Signatur. Die geerbten Methoden stellen also logischerweise eine einzelne Methode dar.
  • @FunctionalInterface Die Annotation kann oben in der Schnittstellendeklaration verwendet werden.

Deployable.java

package net.javabeat;

public interface Deployable {
	Iterable someWork(Iterable<String> arg);
}

Instanzerstellung für funktionale Schnittstelle

Um Instanzen aus Ihren Funktionsschnittstellen zu erstellen, haben Sie drei Möglichkeiten:

  • Erstellen Sie eine Klasse, die Ihre funktionale Schnittstelle implementiert, und erstellen Sie einfach eine Instanz dieser definierten Klasse. (Wird vor Java 8 verwendet).
  • Erstellen Sie einen Methodenreferenzausdruck (anonyme Instanz, verwendet vor Java 8).
  • Verwenden von Lambda-Ausdrücken (Neu für Java 8).
  • Schauen Sie sich die folgenden Beispiele an, die mithilfe der ersten und zweiten Optionen eine Instanz einer bestimmten Funktionsschnittstelle erstellen würden. Die dritte Option wird im erläutert Lambda-Ausdruck Abschnitt.

    SomeInterface.java

    package net.javabeat;
    public interface Deployable {
    	Integer someWork();
    }
    

    UIComponent.java

    package net.javabeat;
    public class UIComponent {
    	public static void main(String [] args){
    		Deployable deployable = new Deployable() {
    			@Override
    			public Integer someWork() {
    				return 1;
    			}
    		};
    		System.out.println("Invoke SomeWork Method Against SomeInterface :: "+deployable.someWork());
    	}
    }
    

    Die Ausgabe wird sein:

    Invoke SomeWork Method Against SomeInterface :: 1
    

    Kommentar verfassen

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

    Nach oben scrollen