logo

Java-Funktionsschnittstellen

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

Java
public 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

Java
class 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:

  1. Verbraucher
  2. Prädikat
  3. Funktion 
  4. 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:

AnbieterLieferant = () -> 'Hallo Welt!';

Beispiel: Verwenden der Prädikatschnittstelle zum Filtern von Zeichenfolgen

Java
import 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