Eine funktionale Schnittstelle in Java ist eine Schnittstelle, die nur eine abstrakte Methode enthält. Funktionale Schnittstellen können mehrere Standard- oder statische Methoden, aber nur eine abstrakte Methode haben.
Ab Java 8 können Lambda-Ausdrücke und Methodenreferenzen verwendet werden, um die Instanz einer funktionalen Schnittstelle darzustellen.
Beispiel: Verwendung einer funktionalen Schnittstelle mit Lambda-Ausdruck
Javapublic class Geeks { public static void main(String[] args) { // Using lambda expression to implement Runnable new Thread(() -> System.out.println('New thread created')).start(); } }
Ausgabe
New thread created
Erläuterung:
- Das obige Programm demonstriert die Verwendung des Lambda-Ausdrucks mit der Runnable-Funktionsschnittstelle.
- Runnable verfügt über eine abstrakte Methode run() und qualifiziert sich daher als funktionale Schnittstelle.
- Lambda()->System.out.println('Neuer Thread erstellt') definiert die run()-Methode.
- new Thread().start() startet einen neuen Thread, der den Lambda-Body ausführt
Notiz:
A F Eine funktionale Schnittstelle kann auch eine andere funktionale Schnittstelle erweitern.
@FunctionalInterface Anmerkung
Die Annotation @FunctionalInterface wird verwendet, um sicherzustellen, dass die funktionale Schnittstelle nicht mehr als eine abstrakte Methode haben kann. Falls mehr als eine abstrakte Methode vorhanden ist, meldet der Compiler die Meldung „Unerwartete @FunctionalInterface-Annotation“. Es ist jedoch nicht zwingend erforderlich, diese Anmerkung zu verwenden.
Notiz:
Die Annotation @FunctionalInterface ist optional, aber es ist eine gute Praxis, sie zu verwenden. Es hilft, den Fehler frühzeitig zu erkennen, indem sichergestellt wird, dass die Schnittstelle nur über eine abstrakte Methode verfügt.
Beispiel: Definieren einer funktionalen Schnittstelle mit der Annotation @FunctionalInterface
Java@FunctionalInterface interface Square { int calculate(int x); } class Geeks { public static void main(String args[]) { int a = 5; // lambda expression to define the calculate method Square s = (int x) -> x * x; // parameter passed and return type must be same as defined in the prototype int ans = s.calculate(a); System.out.println(ans); } }
Ausgabe
25
Erläuterung :
- Square ist eine funktionale Schnittstelle mit einer einzigen Methode berechne(int x).
- Zur Implementierung der Berechnungsmethode wird ein Lambda-Ausdruck (int x) -> x * x verwendet.
- Lambda nimmt x als Eingabe und gibt x * x zurück.
Java-Funktionsschnittstellen vor Java 8
Vor Java 8 mussten wir anonyme innere Klassenobjekte erstellen oder diese Schnittstellen implementieren. Nachfolgend finden Sie ein Beispiel dafür, wie die Runnable-Schnittstelle vor der Einführung von Lambda-Ausdrücken implementiert wurde.
Beispiel: Java-Programm zur Demonstration der funktionalen Schnittstelle
Javaclass Geeks { public static void main(String args[]) { // create anonymous inner class object new Thread(new Runnable() { @Override public void run() { System.out.println('New thread created'); } }).start(); } }
Ausgabe
New thread created
Integrierte Java-Funktionsschnittstellen
Seit Java SE 1.8 gibt es viele Schnittstellen, die in funktionale Schnittstellen umgewandelt werden. Alle diese Schnittstellen sind mit @FunctionalInterface annotiert. Diese Schnittstellen sind wie folgt:
Git-Status
- Lauffähig: Diese Schnittstelle enthält nur die laufen() Verfahren.
- Vergleichbar: Diese Schnittstelle enthält nur die Methode CompareTo().
- ActionListener: Diese Schnittstelle enthält nur die Methode actionPerformed().
- Abrufbar: Diese Schnittstelle enthält nur die Methode call().
Arten von Funktionsschnittstellen in Java
Java SE 8 enthielt vier Hauptarten funktionaler Schnittstellen, die wie unten erwähnt in mehreren Situationen angewendet werden können:
- Verbraucher
- Prädikat
- Funktion
- Anbieter
1. Verbraucher
Der Verbraucherschnittstelle Die funktionale Schnittstelle ist diejenige, die nur ein Argument oder ein gentrifiziertes Argument akzeptiert. Die Consumer-Schnittstelle hat keinen Rückgabewert. Es gibt nichts zurück. Es gibt auch funktionale Varianten des Consumers DoubleConsumer IntConsumer Und LongConsumer . Diese Varianten akzeptieren primitive Werte als Argumente.
Neben diesen Varianten gibt es auch eine weitere Variante der Consumer-Schnittstelle namens Bi-Verbraucher .
Syntax:
Verbraucher
Consumer = (Wert) -> System.out.println(Wert);
Diese Implementierung der Java Consumer-Funktionsschnittstelle druckt den Wert, der als Parameter an die Druckanweisung übergeben wird. Diese Implementierung verwendet die Lambda-Funktion von Java.
2. Prädikat
Der Prädikatschnittstelle stellt eine boolesche Funktion eines Arguments dar. Es wird häufig für Filtervorgänge in Streams verwendet. Genau wie die Consumer-Funktionsschnittstelle verfügt auch die Predicate-Funktionsschnittstelle über einige Erweiterungen. Diese sind IntPredicate DoublePredicate Und LongPredicate . Diese Arten von funktionalen Prädikatschnittstellen akzeptieren nur primitive Datentypen oder Werte als Argumente.
Syntax:
Prädikat für öffentliche Schnittstelle
{
boolescher Test(T t);
}
Die Java-Prädikat-Funktionsschnittstelle kann auch mithilfe von Lambda-Ausdrücken implementiert werden.
Prädikat
Prädikat = (Wert) -> Wert != null;
3. Funktion
A Funktion ist eine Art funktionale Schnittstelle in Java, die nur ein einziges Argument empfängt und nach der erforderlichen Verarbeitung einen Wert zurückgibt. Viele verschiedene Versionen der Funktionsschnittstellen sind instrumentell und werden häufig in primitiven Typen wie double int long verwendet.
Syntax:
Funktion
Funktion = (Wert) -> Wert * Wert;
- Bi-Funktion: Der Bi-Funktion hängt im Wesentlichen mit einer Funktion zusammen. Außerdem benötigt es zwei Argumente, während Function ein Argument akzeptiert.
- Unärer Operator und Binäroperator: Es gibt auch zwei weitere funktionale Schnittstellen, die wie folgt benannt sind Unärer Operator Und Binärer Operator. Beide erweitern die Funktion bzw. die Bi-Funktion, wobei sowohl der Eingabetyp als auch der Ausgabetyp gleich sind.
4. Lieferant
Der Anbieter Eine funktionale Schnittstelle ist ebenfalls eine Art funktionaler Schnittstelle, die keine Eingaben oder Argumente entgegennimmt und dennoch eine einzelne Ausgabe zurückgibt. Die verschiedenen Erweiterungen der Lieferantenfunktionsschnittstelle enthalten viele andere Lieferantenfunktionen wie z BooleanSupplier DoubleSupplier LongSupplier Und IntSupplier . Der Rückgabetyp all dieser weiteren Spezialisierungen sind nur die entsprechenden Grundelemente.
Syntax:
Anbieter
Lieferant = () -> 'Hallo Welt!';
Beispiel: Verwenden der Prädikatschnittstelle zum Filtern von Zeichenfolgen
Javaimport java.util.*; import java.util.function.Predicate; class Geeks { public static void main(String args[]) { // create a list of strings List<String> n = Arrays.asList('Geek' 'GeeksQuiz' 'g1' 'QA' 'Geek2'); // declare the predicate type as string and use lambda expression to create object Predicate<String> p = (s) -> s.startsWith('G'); // Iterate through the list for (String st : n) { // call the test method if (p.test(st)) System.out.println(st); } } }
Ausgabe
Geek GeeksQuiz Geek2
Tabelle der funktionalen Schnittstellen
Funktionale Schnittstellen | Beschreibung | Verfahren |
|---|---|---|
Lauffähig | Es stellt eine Aufgabe dar, die von einem Thread ausgeführt werden kann. | void run() |
Vergleichbar | Es vergleicht zwei Objekte zur Bestellung. | int CompareTo(T o) |
ActionListener Generizität in Java | Es behandelt ein Aktionsereignis in der ereignisgesteuerten Programmierung. | void actionPerformed(ActionEvent e) |
Abrufbar | Es stellt eine Aufgabe dar, die ein Ergebnis zurückgeben oder eine Ausnahme auslösen kann. | V call() löst eine Ausnahme aus |
Verbraucher | Es akzeptiert ein einzelnes Eingabeargument und gibt kein Ergebnis zurück. | void akzeptieren(T t) |
Prädikat | Es akzeptiert ein einzelnes Argument und gibt ein boolesches Ergebnis zurück. | boolescher Test (T t) |
Funktion | Es akzeptiert ein einzelnes Argument und gibt ein Ergebnis zurück. | R anwenden(T t) |
Anbieter Linux-Befehl für zip | Es benötigt keine Argumente, sondern liefert ein Ergebnis. | T get() |
BiConsumer | Es akzeptiert zwei Argumente und gibt kein Ergebnis zurück. | void akzeptieren(T t U u) |
BiPredicate | Es akzeptiert zwei Argumente und gibt ein boolesches Ergebnis zurück. | Boolescher Test (T t U u) |
BiFunktion | Es akzeptiert zwei Argumente und gibt ein Ergebnis zurück. | R anwenden(T t U u) |
UnaryOperator | Dies ist ein Sonderfall von Function, bei dem Eingabe- und Ausgabetypen gleich sind. | T gelten(T t) |
BinärOperator | Dies ist ein Sonderfall von BiFunction, bei dem Eingabe- und Ausgabetypen gleich sind. | T gelten(T t1 T t2) |
Verwandte Artikel
- Java 8
- Java-Lambda-Ausdrücke