Lambdas, Methodenref, fkt Programmierung ?

Niknak

Neues Mitglied
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. :D

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.
 

DrPils

Bekanntes Mitglied
Schau mal in die Compilierte Dateien. Wirst festellen, dass bei Anonymen Klassen eine Class Datei mit dem namen xxx$1.class oder so erstellt wird. Bei Lambdas passiert das nicht. Also sind Lambdas nicht die kurzschreibweisse von Anonymen Klassen :)
 

KonradN

Super-Moderator
Mitarbeiter
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?
Lambda Ausdrücke könnte man als anonyme Methoden bezeichnen. Die Java Laguage Specification nutzt diesen Ausdruck so zwar nicht, aber auch dort geht es in diese Richtung:
A lambda expression is like a method: it provides a list of formal parameters and a body - an expression or block - expressed in terms of those parameters.

Daher wird auch kein Interface implementiert wie bei einer Klasse. Da nur eine Methode implementiert wird, muss es ein funktionales Interface sein, ein Interface mit nur einer Methode.

Thema 2 Methodenreferenzen:

Nutzt man, wenn man in Lambdas nur eine bereits exstierende Methode aufrufen möchte.
Nein, die Methodenreferenzen werden nicht in Lambdas genutzt. Methodenreferenzen sind - wer hätte das gedacht - Referenzen auf Methoden.

Das ist also auch kein verkürzter Lambda Ausdruck oder so. Anonyme Klasse, Lambda Ausdruck und Methodenreferez sind 3 unterschiedliche Dinge, die so streng genommen nichts gemeinsam haben.

Somit läuft jetzt bei Interfaces folgende Möglichkeiten:
- Vor Java 1.8:
-- Es können Instanzen angegeben werden, die das Interface implementieren
-- Es kann eine anonyme Klasse erstellt werden, die das Interface implementiert
- Ab Java 1.8 gibt es nun noch ein funktionales Interface - dieses setzt nur die Implementation einer Methode voraus. Daher kann man lediglich eine Methode angeben:
-- Lambda Ausdruck - auch anonyme Methode nennbar
-- Methodenreferenz - also eine Referenz auf eine beliebige Methode mit passender Signatur.
Somit haben wir das jetzt wie zuvor auch schon: Bei einem funktionalen Interface wird lediglich eine Implementation der einen Methoden benötigt. Diese eine Methode kann also als anonyme Methode (Lambda Ausdruck) oder über eine Methodenreferenz angegeben werden.
 

httpdigest

Top Contributor
Kurz noch dazugesagt: Lambda Ausdrücke sind faktisch Implementierungen eines Interfaces, aber eben weder durch eine "normale" Klasse noch durch eine "anonyme Klasse" (im Sinne der JLS), sondern die Klasse wird zur Laufzeit durch einen "Bootstrapping"-Prozess generiert.
Die Java Language Specification lässt hier geschickterweise natürlich die Implementierungsmethode für Lambda-Ausdrücke explizit offen, aber im Endeffekt muss es eine Instanz eines Typs sein, der zuweisungskompatibel zum Zielinterface (dem funktionalen Interface) ist, also muss es in irgendeiner Form und Weise eine Instanz einer Klasse sein.
Das ist auch in HotSpot so, und Lambda Ausdrücke (und auch Method References) werden dort als sogenannte "Hotspot anonymous classes" realisiert. Das sind seeehr anonyme Klassen, die sich nicht in die Class Hierarchy oder den ClassLoader registrieren und auch nicht per Reflection "gelookuped" werden können.
 

Niknak

Neues Mitglied
Erstmal vielen Dank für Eure Antworten!

Okay Lambda != Anonyme Klasse. Und warum die so funktionieren wie sie funktionieren, ist wohl nicht so trivial. Als Anfänger begnüge ich mich glaube ich vorerst mit der Erklärung von @KonradN: Lambda ist eine anonyme Methode. Darunter kann ich mir jetzt noch am ehesten etwas vorstellen. ^^

Bezgl. der Methodenreferenzen: Das werde ich mir nochmal etwas genauer ansehen müssen.

Vllt wähne ich mich jetzt auch in falscher Sicherheit, aber wenn der Rest den ich geschrieben habe nicht ganz falsch war, bin ich jetzt schonmal happy. :D
 

Neumi5694

Top Contributor
Nichts macht jemals einen Sinn, aber manchmal ergibt es welchen.
Sinnvoll ist, das zu verwenden, das den Code am einfachsten wartbar und lesbar macht.
Hat der Aufruf einen Spaghetticode von 200 Zeilen, ist das zwar schon per se unsinnig, aber in dem Fall würde ich auf jeden Fall auch bei einmaliger Verwendung in eine Methode auslagern.
Hat man eine Methode, die genau einen Zweck hat und deren Name eindeutig beschreibt, was sie macht, dann sollte das auf jeden Fall so bleiben, egal wie oft sie aufgerufen wird.
 

mihe7

Top Contributor
Bezgl. der Methodenreferenzen: Das werde ich mir nochmal etwas genauer ansehen müssen.
Kleines Beispiel:
Java:
List.of("A","B","C").forEach(new Consumer<String>() {
        public void accept(String elem) {
            System.out.println(elem);
        }
    });
Die Methode forEach erwartet ganz allgemein einen Consumer<? super T>, wobei T hier der Typ der List, also String, ist.

Consumer ist ein funktionales Interface, es gibt also nur eine (deklarierte aber nicht definierte) Methode, nämlich eine, die einen String (oder eine Superklasse von String, sprich: Object) erwartet und nichts zurückgibt. Im Prinzip könnte man also jede x-beliebige Methode als Consumer verwenden, die ebenso einen String (oder ein Object) erwartet und nichts zurückgibt.

Dabei heißt "jede x-beliebige", dass auch Methoden ohne Namen möglich wären, die man mit Hilfe eines Lambda-Ausdrucks angeben kann:
Java:
List.of("A","B","C").forEach(elem -> System.out.println(elem));

Wenn wir uns System.out.println() genauer ansehen, dann gibt es dort eine Methode, die selbst schon den Anforderungen genügt: eine Methode, die einen String erwartet und nichts zurückgibt.

Jetzt wäre es doch schön, wenn man statt des Lambda-Ausdrucks auch direkt die Methode System.out.println verwenden könnte, man müsste nur irgendwie eine Referenz zu dieser Methode angeben können... Huch:
Java:
List.of("A","B","C").forEach(System.out::println);
:)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W for Schleife in allgemeingültiges Konstrukt aus Stream und Lambdas Java Basics - Anfänger-Themen 6
B Sinn von Lambdas? Java Basics - Anfänger-Themen 16
J Best Practice Debugging in Java8 Lambdas Java Basics - Anfänger-Themen 1
M Java Programmierung Aufgabe Anfänger Java Basics - Anfänger-Themen 1
F Automat-Programmierung Java Basics - Anfänger-Themen 30
districon Dynamisch Programmierung/Backtracking/Memoization Java Basics - Anfänger-Themen 3
S Buchstaben Programmierung Bedeutung Java Basics - Anfänger-Themen 4
S Hilfe bei Programmierung einer Hotelabrechnung Java Basics - Anfänger-Themen 5
enjoykimii Strukturierte Programmierung Hilfe Java Basics - Anfänger-Themen 29
A Frage zur programmierung Java Basics - Anfänger-Themen 12
Nerdinfekt Programmieranfänger, Schwierigkeiten mit der Programmierung Java Basics - Anfänger-Themen 6
U Compiler-Fehler Programmierung einer Drehkugel Java Basics - Anfänger-Themen 8
L Programmierung mit Hash Java Basics - Anfänger-Themen 3
C Wie habt Ihr angefangen mit der Java Programmierung, ohne Programmiervorkenntnisse Java Basics - Anfänger-Themen 8
J Problem bei der Programmierung eines Tannenbaums Java Basics - Anfänger-Themen 9
S GUI-Programmierung Sudoku-Rätsel lösen Java Basics - Anfänger-Themen 1
B Fibonacci Zahlen dynamische Programmierung Java Basics - Anfänger-Themen 7
S Programmierung simulieren - aber wie?! Java Basics - Anfänger-Themen 3
H Java Programmierung Java Basics - Anfänger-Themen 3
W Problem bei Programmierung von Monte-Carlo-Integration Java Basics - Anfänger-Themen 12
D Guten Tag mache gerade eine Umschulung zum FiSi war leider jetzt 2 Wochen Krank und wir hatten Prozendurale Programmierung. Java Basics - Anfänger-Themen 3
P Rechnen mit Brüchen - objektorientierte Programmierung Java Basics - Anfänger-Themen 18
D Objektorientierte Programmierung Java Basics - Anfänger-Themen 13
F Attribute bei Objektorientierter Programmierung Java Basics - Anfänger-Themen 11
F Ich brauche Hilfe bei Objektorientierter Programmierung... Java Basics - Anfänger-Themen 19
F Problem beim entfernen von mehreren Listenelementen auf einmal (Programmierung des Spiels Arschloch) Java Basics - Anfänger-Themen 1
Q Objektorientierte Programmierung Java Basics - Anfänger-Themen 17
J Texte für Java Programmierung besser verstehen? Java Basics - Anfänger-Themen 2
C GUI Programmierung unter Windows mit Java womit? Java Basics - Anfänger-Themen 11
D Collections Aufgaben Java-Programmierung Überforderung Java Basics - Anfänger-Themen 36
A GUI Programmierung mit Textfield Java Basics - Anfänger-Themen 3
J Programmierung Quiz Spiel Java Basics - Anfänger-Themen 3
J Programmierung Quiz Spiel Java Basics - Anfänger-Themen 2
U Brauche Hilfe bei Programmierung einer Produktdatenbank App Java Basics - Anfänger-Themen 4
L Dynamische Programmierung Java Basics - Anfänger-Themen 0
J Verschieden Fragen über Java Programmierung Java Basics - Anfänger-Themen 3
A Methoden Habe ein Problem bei folgender Programmierung Java Basics - Anfänger-Themen 15
slejden Erste Schritte Frage zur OOP (objektorientierten Programmierung Java Basics - Anfänger-Themen 4
V Threads Nebenläufige Programmierung Java Basics - Anfänger-Themen 6
V Nebenläufige Programmierung Java Basics - Anfänger-Themen 5
Henri Paare Frage über Java Programmierung Java Basics - Anfänger-Themen 10
S Programmierung eines Geldwechselautomaten! Java Basics - Anfänger-Themen 2
R Einige Neulingsfragen (Wrapper, GUI-Programmierung) Java Basics - Anfänger-Themen 4
D JavaBeans und die visuelle Programmierung Java Basics - Anfänger-Themen 2
M Dringend Experten für Scala-Play basierte Programmierung!!!! Java Basics - Anfänger-Themen 0
Z Programmierung eines Stacks Java Basics - Anfänger-Themen 19
A Programmierung herangehensweise Java Basics - Anfänger-Themen 9
T Objektorientierte Programmierung - Kein Plan wieso das nicht funktioniert! Java Basics - Anfänger-Themen 6
G 3D-Spiele-Programmierung Java Basics - Anfänger-Themen 3
I Programmierung-Hausaufgabe: Hilfe benötigt Java Basics - Anfänger-Themen 8
R Kann jemand diese Java Programmierung machen? Versteh ich leider nicht Java Basics - Anfänger-Themen 17
T Nachhilfe JAVA Programmierung Java Basics - Anfänger-Themen 1
R Schaffe es nicht Random-Programmierung zu vollenden. Wo liegt der Fehler in diesem Code? Java Basics - Anfänger-Themen 13
N Socket-Programmierung Java Basics - Anfänger-Themen 4
kaoZ Android Programmierung / Erstellen einer neuen Instanz Java Basics - Anfänger-Themen 2
O OOP Input & Output in der GUI-Programmierung Java Basics - Anfänger-Themen 2
O Java Grafik-Programmierung? Java Basics - Anfänger-Themen 16
F Fehler bei Array und Index Programmierung Java Basics - Anfänger-Themen 18
K Objektorientierten Programmierung Java Basics - Anfänger-Themen 3
R Einstieg in Programmierung Java Basics - Anfänger-Themen 8
W Problem bei MineSweeper Programmierung Java Basics - Anfänger-Themen 10
N Objektorientierte Programmierung: Erben von 2 Klassen - wie ist korrekte Vorgehensweise? Java Basics - Anfänger-Themen 16
D Best Practise für Programmierung Java Basics - Anfänger-Themen 7
D Erste Schritte Einstieg in die Java Spiel Programmierung Java Basics - Anfänger-Themen 7
W objektorientierte Programmierung Java Basics - Anfänger-Themen 25
W objektorientierte Programmierung - String in andere Klasse übergeben Java Basics - Anfänger-Themen 13
E Algorithmen und Programmierung - Datum und Zeit ausgeben? Java Basics - Anfänger-Themen 8
Grejak OOP Einstieg in Objekt-Orientierte-Programmierung Java Basics - Anfänger-Themen 3
D Frage zu Bit Operatoren in der Programmierung Java Basics - Anfänger-Themen 9
U Geräte-Programmierung ? Java Basics - Anfänger-Themen 15
S 2 kurz Fragen zur Möglichkeit der Programmierung Java Basics - Anfänger-Themen 7
T Objektorientierte Programmierung, わからない です Java Basics - Anfänger-Themen 6
J Allgemeine Fragen zur Programmierung Java Basics - Anfänger-Themen 36
N Grafische Programmierung mit jeweils anderen Bildern bei versch. Ergebnissen Java Basics - Anfänger-Themen 9
S Objektorientierte Programmierung Java Basics - Anfänger-Themen 21
M Gui Programmierung Java Basics - Anfänger-Themen 21
J Spielevorschläge für Programmierung Java Basics - Anfänger-Themen 3
O Eisenbahn-Programmierung Java Basics - Anfänger-Themen 8
S Schlechte Programmierung Java Basics - Anfänger-Themen 5
O Probleme bei OO-Programmierung mit Vererbung Java Basics - Anfänger-Themen 18
M Programmierung kürzen??? Java Basics - Anfänger-Themen 5
N Umstieg auf objektorintierte Programmierung Java Basics - Anfänger-Themen 2
N Probleme mit meiner Programmierung Java Basics - Anfänger-Themen 5
M Meine erste Java Programmierung funzt nicht :-( Java Basics - Anfänger-Themen 34
H Programmierung Ampelsteuerung Java Basics - Anfänger-Themen 4
J [Erledigt] Applet Programmierung Java Basics - Anfänger-Themen 4
C Objektorientierte Programmierung Java Basics - Anfänger-Themen 11
T Gui Programmierung lernen Java Basics - Anfänger-Themen 3
E Toolkit (Scanner) Programmierung Java Basics - Anfänger-Themen 5
D Programmierung Profi Java Basics - Anfänger-Themen 18
G Problem bei Programmierung Java Basics - Anfänger-Themen 15
X Objektorientierte Java Programmierung - 3 Fragen zum Code Java Basics - Anfänger-Themen 5
G Problem bei Programmierung Java Basics - Anfänger-Themen 2
G thread programmierung für ANFÄNGER Java Basics - Anfänger-Themen 2
S generic programmierung "ne:w T[X]" Java Basics - Anfänger-Themen 2
A Einstieg in die Programmierung Java Basics - Anfänger-Themen 20
I Frage wegen Wörterbuch Programmierung Java Basics - Anfänger-Themen 13
X Programmierung mit geometrischen Figuren Java Basics - Anfänger-Themen 3
G Opjektorientierte Programmierung (OOP). einfach für euch Java Basics - Anfänger-Themen 4
G Funktions Programmierung Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben