Funktionale Interfaces

Diskutiere Funktionale Interfaces im Java Basics - Anfänger-Themen Bereich.
M

Moritz1234

Ich verstehe nicht wozu man funktionale interfaces braucht? Was genau ist der Sinn? und kann man funktionale interfaces instanziieren?
 
Kirby_Sike

Kirby_Sike

Ein Functional Interface an sich ist ein Java-Interface, welches genau eine abstrakte Methode besitzt. Diese Methode wird anschließend durch den übergebenen Lambda-Ausdruck implementiert. In Java vordefinierte Functional Interfaces sind beispielsweise „Function“, „Predicate“ oder „BinaryOperator“. Jedes Interface definiert dabei die Parameter und den Rückgabewert der Einzigen abstrakten Methode anders.
 
mihe7

mihe7

Das ist relativ einfach: ein funktionales Interface dient dazu, eine Funktion zu deklarieren. Die Unterscheidung, ob ein Interface funktional ist oder nicht, besteht einfach darin, wie viele nicht definierte Methoden das Interface enthält: falls nur eine Methode nicht definiert ist, handelt es sich um ein funktionales Interface, sonst nicht.

Benutzt wird das ganze im Zusammenhang mit Lambdas, also anonymen Funktionen, um eine Implementierung dieses Interfaces (sprich: die Funktion) anzugeben.

Nehmen wir mal eine Funktion an, die zwei Ganzzahlen addiert. Mathematisch formal ließe sich das schreiben als f:int x int -> int mit f(a, b) := a + b. Das ist jetzt aber eine benannte Funktion f. Lassen wir den Namen weg, erhalten wir int x int -> int mit (a,b) := a+b oder kürzer (int a, int b) := a + b. Jetzt sind wir schon fast bei der Lambda-Schreibweise von Java. Dort würde er Lambda-Ausdruck so aussehen (int a, int b) -> a + b.

Wozu braucht man jetzt das Interface? Nun, Java ist eine Sprache mit statischer Typsicherheit. Zur Übersetzungszeit müssen die Typen also bekannt sein. Das Problem ist also, wie man z. B. einen Parameter angibt, der eine Funktion entgegennimmt, die dann auch noch anonym implementiert werden kann. Die Lösung ist recht einfach: ein funktionales Interface.

Nehmen wir mal java.awt.event.ActionListener. Dieses Interface bestitzt genau eine Methode (=Funktion):
Java:
void actionPerformed(ActionEvent e);
und ist damit ein funktionales Interface.

Die Methode addActionListener von z. B. JButton erwartet nun ein Objekt mit ActionListener-Schnittstelle.
Java:
public void addActionListener(ActionListener l)
Statt nun das Interface mit Hilfe einer anonymen Klasse zu implementieren
Java:
button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        // mach was (ggf. mit e)
    }
});
kann an jetzt auf einen Lambda-Ausdruck zurückgreifen:
Java:
button.addActionListener(e -> System.out.println("Pressed " + e));
Natürlich kann man das ActionListener-Objekt auch explizit definieren:
Java:
ActionListener listener = e -> System.out.println("Pressed " + e);
button.addActionListener(listener);
 
M

Moritz1234

Das ist relativ einfach: ein funktionales Interface dient dazu, eine Funktion zu deklarieren. Die Unterscheidung, ob ein Interface funktional ist oder nicht, besteht einfach darin, wie viele nicht definierte Methoden das Interface enthält: falls nur eine Methode nicht definiert ist, handelt es sich um ein funktionales Interface, sonst nicht.

Benutzt wird das ganze im Zusammenhang mit Lambdas, also anonymen Funktionen, um eine Implementierung dieses Interfaces (sprich: die Funktion) anzugeben.

Nehmen wir mal eine Funktion an, die zwei Ganzzahlen addiert. Mathematisch formal ließe sich das schreiben als f:int x int -> int mit f(a, b) := a + b. Das ist jetzt aber eine benannte Funktion f. Lassen wir den Namen weg, erhalten wir int x int -> int mit (a,b) := a+b oder kürzer (int a, int b) := a + b. Jetzt sind wir schon fast bei der Lambda-Schreibweise von Java. Dort würde er Lambda-Ausdruck so aussehen (int a, int b) -> a + b.

Wozu braucht man jetzt das Interface? Nun, Java ist eine Sprache mit statischer Typsicherheit. Zur Übersetzungszeit müssen die Typen also bekannt sein. Das Problem ist also, wie man z. B. einen Parameter angibt, der eine Funktion entgegennimmt, die dann auch noch anonym implementiert werden kann. Die Lösung ist recht einfach: ein funktionales Interface.

Nehmen wir mal java.awt.event.ActionListener. Dieses Interface bestitzt genau eine Methode (=Funktion):
Java:
void actionPerformed(ActionEvent e);
und ist damit ein funktionales Interface.

Die Methode addActionListener von z. B. JButton erwartet nun ein Objekt mit ActionListener-Schnittstelle.
Java:
public void addActionListener(ActionListener l)
Statt nun das Interface mit Hilfe einer anonymen Klasse zu implementieren
Java:
button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        // mach was (ggf. mit e)
    }
});
kann an jetzt auf einen Lambda-Ausdruck zurückgreifen:
Java:
button.addActionListener(e -> System.out.println("Pressed " + e));
Natürlich kann man das ActionListener-Objekt auch explizit definieren:
Java:
ActionListener listener = e -> System.out.println("Pressed " + e);
button.addActionListener(listener);
Vielen dank für die ausführliche Erklärung!
 
Thema: 

Funktionale Interfaces

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben