JavaRush /Java-Blog /Random-DE /Kaffeepause Nr. 182. Funktionale Schnittstellen in Java

Kaffeepause Nr. 182. Funktionale Schnittstellen in Java

Veröffentlicht in der Gruppe Random-DE
Quelle: DZone Hier ist eine Übersicht über funktionale Schnittstellen in Java: Zweck, Beispiele, Lambda-Ausdrücke und eine Liste vordefinierter Schnittstellen. Kaffeepause Nr. 182.  Funktionale Schnittstellen in Java - 1Als objektorientierte Programmiersprache konnte Java bisher keine unabhängigen Funktionen haben, da sich in der Sprache bis auf einige primitive Datentypen und Methoden alles um Klassen und Objekte dreht. Allerdings führte Java 8 ein neues Konzept namens Functional Interface sowie einige andere Funktionen wie Lambda-Ausdrücke, Time API, Stream API usw. ein. Was sind diese funktionalen Schnittstellen und wie werden sie definiert? Lass es uns herausfinden!

Was ist eine Schnittstelle?

Eine Schnittstelle ist ein Regelwerk, das die Interaktion von Systemelementen bestimmt. Es wird auch als Gliederung einer Klasse bezeichnet, die abstrakte Methoden und statische Konstanten enthält. Eine Schnittstelle kann eine oder mehrere abstrakte Methoden enthalten. Mithilfe von Schnittstellen können Sie auch Anforderungen für Klassen festlegen, d. h. welche Methoden von der Klasse benötigt werden. Einfach ausgedrückt ist eine Schnittstelle wie ein Vertrag, den jede implementierende Klasse einhalten muss. Hier ist ein Beispiel:
Interface A1
{
void method1();
String method2(String X);
}

Class A1 implements A
{
@Override
public void method1(){}
@Override
public String method2(String X) { return x; }
}
Wenn die Klasse, die die Schnittstelle implementiert, nicht alle Methoden der Schnittstelle deklariert, wird der Code nicht ausgeführt und generiert einen Fehler: „ Fehler: A1 ist nicht abstrakt und überschreibt keine abstrakte Methode in A1.“ " (Fehler: A1 ist nicht abstrakt und überschreibt keine abstrakte Methode in A1). Vor JDK 8 konnten Schnittstellen keine Implementierungen definieren, aber jetzt können Standardimplementierungen für Schnittstellenmethoden hinzugefügt werden. Wir können auch statische und Standardmethoden definieren, die kann ohne ein Objekt in der Schnittstelle aufrufen. Schnittstellen werden hauptsächlich verwendet, um Mehrfachvererbung und lose Kopplung im Code zu erreichen. Nachdem wir nun ein klares Verständnis von Schnittstellen haben, wollen wir sehen, was eine funktionale Schnittstelle ist und wie sie funktioniert.

Was ist eine funktionale Schnittstelle?

Die funktionale Schnittstelle wird auch als Single Abstract Method (SAM)-Schnittstelle bezeichnet. Wie der Name schon sagt, kann es höchstens eine abstrakte Methode haben. Eine funktionale Schnittstelle kann mehrere statische und Standardmethoden mit einer Implementierung sowie eine zusätzliche abstrakte Methode haben. Um eine Schnittstelle als funktionsfähig zu markieren, wird die Annotation @FunctionalInterface verwendet . Dies ist erforderlich, um die irrtümliche Deklaration zusätzlicher Methoden zu vermeiden. Was die funktionale Schnittstelle so beliebt macht, ist die Möglichkeit, Lambda-Ausdrücke zum Erstellen von Schnittstellen zu verwenden, ohne anonyme und umständliche Klassenimplementierungen zu verwenden. Die Verwendung des Schlüsselworts abstract in funktionalen Schnittstellen ist optional, da in einer Schnittstelle definierte Methoden standardmäßig abstrakt sind.

Was sind Lambda-Ausdrücke?

Ein Lambda-Ausdruck ist eine unbenannte oder anonyme Methode, die nicht eigenständig ausgeführt wird, sondern zur Implementierung bestimmter Methoden einer funktionalen Schnittstelle verwendet wird. Es ist wie folgt definiert:
(parameter list) -> lambda body
Der Pfeiloperator ( -> ), den Sie im Code sehen, wird als Lambda-Operator bezeichnet. Wenn wir zum Beispiel die folgende Methode haben:
double getGoldenRatioValue() {
return 1.61803;
}
Mit einem Lambda-Ausdruck können wir es so schreiben:
() -> 1.61803
Wie Sie sehen, hat die Methode in der Lambda-Funktion keine Parameter, daher ist die linke Seite der Anweisung leer. Da die rechte Seite die Aktion bestimmt, wird in diesem Beispiel der Wert des Goldenen Schnitts zurückgegeben: 1,61803. Vor Java 8 war die Implementierung von Schnittstellen oder die Erstellung innerer Klassenobjekte von entscheidender Bedeutung, aber mit Java 8 müssen wir jetzt nur noch Lambda-Ausdrücke funktionalen Schnittstellen zuweisen.

Beispiele für funktionale Schnittstellen

Um funktionale Schnittstellen zu erstellen, können Sie entweder die Annotation @FunctionalInterface oder die vordefinierten funktionalen Schnittstellen von Java verwenden.

Beispiel 1

  • Zuerst markieren wir @FunctionalInterface und erstellen eine Schnittstelle namens MyInterface , die von der abstrakten Methode getGoldenRationValue() aufgerufen wird .
  • Dann erstellen wir eine öffentliche Klasse main, um die Methode auszuführen.
  • Um einen Lambda-Ausdruck in einer funktionalen Schnittstelle zu verwenden, deklarieren wir eine Referenz auf MyInterfaceDemo und weisen dann den Lambda-Ausdruck dieser Referenz zu.
  • Abschließend drucken wir den Wert des Goldenen Schnitts über die Referenzschnittstelle aus.
import java.lang.FunctionalInterface;

// Schaffung и маркировка функционального интерфейса
@FunctionalInterface

interface MyInterface {
// Это абстрактный метод
double getGoldenRatioValue();
}

public class Main {
public static void main( String[] args ) {

//декларируем ссылку на функциональный интерфейс
MyInterface ref;
//используем Lambda Expression
ref = () -> 1.61803;

System.out.println("Value of Golden Ratio = " + ref.getGoldenRatioValue());
}
}
Abschluss:
Wert des Goldenen Schnitts = 1,61803

Beispiel 2

  • In diesem Beispiel verwenden wir die vordefinierte Funktionsschnittstelle ToDoubleFunction , die ein T- Argument akzeptiert und als Ausgabe ein Double zurückgibt .
  • ToDoubleFuntion enthält eine abstrakte Methode namens applyasDouble() .
  • Abschließend drucken wir die gesamte Länge der Nachricht, einschließlich Leerzeichen.
import java.util.function.ToDoubleFunction;
public class MyInterface2 {

public static void main(String[] args) {

ToDoubleFunction<String> length = x -> x.length();

System.out.println(length.applyAsDouble("This is an example of predefined functional interface."));
}
}
Abschluss:
54,0

Liste der vorinstallierten Funktionsschnittstellen

Nachdem wir nun wissen, wie man Funktionsschnittstellen definiert, wollen wir sehen, wie viele vordefinierte (integrierte) Funktionsschnittstellen es gibt. Es gibt vier Haupttypen von Funktionsschnittstellen, die in verschiedenen Situationen implementiert werden können: Consumer , Predicate , Function und Supplier . Unter diesen vier Schnittstellen verfügen Consumer , Function und Predicate über zusätzliche Funktionsschnittstellen. Hier ist eine Liste aller integrierten oder vordefinierten Schnittstellen in Java. Notiz. T, U und R, die in der folgenden Tabelle erwähnt werden, stellen den Typ des ersten Arguments (T), des zweiten Arguments (U) bzw. des Ergebnisses (R) der Operation dar.
Schnittstelle Typ
Lauffähig
BiConsumer(T, U) T, U →
BiFunktion(T, U, R) T, U → R
BinärOperator T, T <→ R
BiPredicate<T, U> T, U → Boolescher Wert
BooleanSupplier → Boolescher Wert
Verbraucher T →
DoubleBinaryOperator doppelt, doppelt → doppelt
DoubleConsumer doppelt →
DoubleFunction doppelt → R
DoublePredicate doppelt → boolesch
DoubleSupplier boolescher Wert →
DoubleToIntFunction doppelt → int
DoubleToLongFunction doppelt → lang
DoubleUnaryOperator doppelt → doppelt
Funktion<T, R> T → R
IntBinaryOperator int → int
IntConsumer int →
IntFunction int → R
IntPredicate int → boolesch
IntSupplier → int
IntToDoubleFunction int → double
IntToLongFunction int → lang
IntUnaryOperator int → int
LongBinaryOperator lang, lang → lang
LongConsumer lang →
LongFunction lang → R
LongPredicate lang →
LongSupplier → lang
LongToDoubleFunction lang → doppelt
LongToIntFunction lang → int
LongUnaryOperator lang → lang
ObjDoubleConsumer T, doppelt →
ObjIntConsumer T, int →
ObjLongConsumer T, lang →
Prädikat T → Boolescher Wert
Anbieter → T
ToDoubleBiFunction<T, U> T, U → doppelt
ToDoubleFunction T → doppelt
ToIntBiFunction<T, U> T, U → int
ToIntFunction T → int
ToLongBiFunction<T, U> T, U → lang
ToLongFunction T → lang
UnaryOperator T → T

Fassen wir es zusammen

Einige wichtige Erkenntnisse aus diesem Beitrag, die Sie sich merken sollten:
  • Die Schnittstelle fungiert als Abstraktionsmechanismus.
  • Eine funktionale Schnittstelle kann mehrere statische und Standardmethoden mit einer Implementierung sowie eine zusätzliche abstrakte Methode haben.
  • Innerhalb einer funktionalen Schnittstelle definierte Methoden sind standardmäßig abstrakt, sodass die Verwendung des Schlüsselworts abstract nicht mehr erforderlich ist.
  • Ein Lambda-Ausdruck ist eine anonyme Methode, die nicht eigenständig ausgeführt wird, sondern zur Implementierung bestimmter Methoden einer funktionalen Schnittstelle verwendet wird.
  • Um funktionale Schnittstellen zu erstellen, können Sie entweder die Annotation @FunctionalInterface oder die vordefinierten funktionalen Schnittstellen von Java verwenden.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION