Moin zusammen!
Ich bin neu hier und beschäftige/lerne gerade Lambda-Ausdrücke und Methodenreferenzen. So ganz ist der Groschen aber noch nicht gefallen und irgendwie überschlägt sich bei jeder neuen Erklärung des Themas die ich lese alles immer weiter in meinem Kopf.
Daher würde ich jetzt gerne einmal etwas "laut" vor mich hin "denken" und wäre froh, wenn mich jemand korrigiert, wenn ich falsch liege. Hoffe so wieder etwas Ordnung bei mir schaffen zu können.
Also Thema 1: Lambdas.
In erster Linie sind Lambdas ein Behälter für Quellcode, den man dann an eine Methode (?) weitergeben kann (Stichwort: Funktionale Programmierung).
Dies funktioniert in Java allerdings nur, wenn die Methode in einem funktionalen Interface deklariert wurde.
Beispielsweise habe ich folgendes Funktionales Interface:
Nun kann ich das in einem Lambda Ausdruck verwenden:
Ich übergebe an die Methode add die beiden Integers (linke Seite) und sage der Methode sie soll die beiden addieren. Zurück erhalte ich das Ergebnis (rechte Seite).
An dieser Stelle habe ich nur leider noch nicht verstanden, WARUM das überhaupt möglich ist. Aus Interfaces lassen sich ja für gewöhnlich keine Objekte erzeugen. Aber irgenwas muss das Interface doch implementieren?
Lambdas sind ja auch nur die Kurzschreibweise für anonyme Klassen. Also das hier oben ist nur die Kurzform für:
Meine Vermutung nun: Wird im Hintergrund ein anonymes Objekt vom Typ Object erzeugt, das das Interface implementiert?
Weiteres Beispiel:
Damit man nun für solch Aufgaben nicht immer selbst ein eigenes Interface schreiben muss, gibts von Seiten Java vorgefertigte Interfaces wie "Function", "BinaryOperator" oder "Consumer".
An die Methode forEach() kann ein Consumer fkt.Interface übergeben werden. Diesem sage ich, dass es jedes Element der Liste printen soll.
Das ist funktionale Programmierung (?).
Neben solch Spielerein sind Lambdas nützlich bei der Arbeit mit Streams und ActionHandlern (z.B. in JavaFX).
Das war soweit alles, was ich zu Lambdas weiß. Was stimmt davon und was nicht? Und hab ich noch etwas wichtiges vergessen?
Thema 2 Methodenreferenzen:
Nutzt man, wenn man in Lambdas nur eine bereits exstierende Methode aufrufen möchte. Verkürzt die Ausdrücke noch ein wenig weiter.
Beispiel mit dem Interface UnaryOperator:
Fehlt hier noch was wichtiges?
So. Das waren meine Gedanken zu den beiden Themen. Allein das niedertippen hat sich für mich schon gelohnt ^^ So hat sich das ein oder andere schonmal etwas entwirrt. Nun würde ich mich aber freuen, wenn Ihr mich korrigieren würdet, denn alles hab ich eben noch nicht ganz verstanden und hier sicherlich auch das ein oder andere falsch ausgeführt.
Ich bin neu hier und beschäftige/lerne gerade Lambda-Ausdrücke und Methodenreferenzen. So ganz ist der Groschen aber noch nicht gefallen und irgendwie überschlägt sich bei jeder neuen Erklärung des Themas die ich lese alles immer weiter in meinem Kopf.
Daher würde ich jetzt gerne einmal etwas "laut" vor mich hin "denken" und wäre froh, wenn mich jemand korrigiert, wenn ich falsch liege. Hoffe so wieder etwas Ordnung bei mir schaffen zu können.
Also Thema 1: Lambdas.
In erster Linie sind Lambdas ein Behälter für Quellcode, den man dann an eine Methode (?) weitergeben kann (Stichwort: Funktionale Programmierung).
Dies funktioniert in Java allerdings nur, wenn die Methode in einem funktionalen Interface deklariert wurde.
Beispielsweise habe ich folgendes Funktionales Interface:
Java:
public interface MatheInterface {
// Funktionales Interface
int doStuff(int a, int b);
}
Nun kann ich das in einem Lambda Ausdruck verwenden:
Java:
class Main {
public static void main(String[] args) {
MatheInterface add = (int a, int b) -> a + b;
System.out.println(add.doStuff(2, 3)); // = 5
}
}
Ich übergebe an die Methode add die beiden Integers (linke Seite) und sage der Methode sie soll die beiden addieren. Zurück erhalte ich das Ergebnis (rechte Seite).
An dieser Stelle habe ich nur leider noch nicht verstanden, WARUM das überhaupt möglich ist. Aus Interfaces lassen sich ja für gewöhnlich keine Objekte erzeugen. Aber irgenwas muss das Interface doch implementieren?
Lambdas sind ja auch nur die Kurzschreibweise für anonyme Klassen. Also das hier oben ist nur die Kurzform für:
Java:
MatheInterface anon = new MatheInterface() {
@Override
public int doStuff(int a, int b) {
return a+b;
}
};
System.out.println(anon.doStuff(2,3));
Meine Vermutung nun: Wird im Hintergrund ein anonymes Objekt vom Typ Object erzeugt, das das Interface implementiert?
Weiteres Beispiel:
Damit man nun für solch Aufgaben nicht immer selbst ein eigenes Interface schreiben muss, gibts von Seiten Java vorgefertigte Interfaces wie "Function", "BinaryOperator" oder "Consumer".
Java:
public static void main(String[] args) {
List<String> lst = Arrays.asList("A", "B", "C");
lst.forEach(x -> System.out.println((x)));
}
}
An die Methode forEach() kann ein Consumer fkt.Interface übergeben werden. Diesem sage ich, dass es jedes Element der Liste printen soll.
Das ist funktionale Programmierung (?).
Neben solch Spielerein sind Lambdas nützlich bei der Arbeit mit Streams und ActionHandlern (z.B. in JavaFX).
Das war soweit alles, was ich zu Lambdas weiß. Was stimmt davon und was nicht? Und hab ich noch etwas wichtiges vergessen?
Thema 2 Methodenreferenzen:
Nutzt man, wenn man in Lambdas nur eine bereits exstierende Methode aufrufen möchte. Verkürzt die Ausdrücke noch ein wenig weiter.
Beispiel mit dem Interface UnaryOperator:
Java:
UnaryOperator<String> var = String::toUpperCase;
System.out.println(var.apply("JavaForum"));
// Ist die 'Kurzform' für:
UnaryOperator<String> varLambda = a -> a.toUpperCase();
System.out.println(varLambda.apply("JavaForum"));
Fehlt hier noch was wichtiges?
So. Das waren meine Gedanken zu den beiden Themen. Allein das niedertippen hat sich für mich schon gelohnt ^^ So hat sich das ein oder andere schonmal etwas entwirrt. Nun würde ich mich aber freuen, wenn Ihr mich korrigieren würdet, denn alles hab ich eben noch nicht ganz verstanden und hier sicherlich auch das ein oder andere falsch ausgeführt.