Lambda Ausdrücke #1 - Grundlagen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Registriere dich um viele Vorteile zu genießen! Weniger Werbung, bessere Kommunikation und vieles mehr!

  • In diesem Eintrag wird mit ein paar Beispielen erklärt warum man Lambda braucht und wie es funktioniert.
    In diesem Eintrag möchte ich etwas näher auf Lambda Ausdrücke eingehen.

    Inhaltsverzeichnis
    • Vorwort
    • Was sind Lambda Ausdrücke
    • Unterschied Lambda und Schleifen
    • Warum sollte man Lambda verwenden


    Vorwort
    Seit Java 8 können Lambda Expressions nun verwendet werden aber viele wissen nicht wie man sie richtig verwendet oder warum.
    In diesem Tutorial möchte ich euch das Thema ein bisschen näher bringen und erklären wie so, weshalb, warum.

    Was sind Lambda Ausdrücke?
    Lambda Ausdrücke eigentlich nichts anderes als eine verkürzte Schreibweise.

    Hier ein kleines Beispiel wie ein Lambda Ausdruck aussehen kann:

    Java-Quellcode

    1. namen.forEach(name -> System.out.println(name));
    Das was zwischen den Klammern von forEach() geschrieben ist, nennt man Lambda.




    Unterschied Lambda und Schleifen

    Wir erstellen uns einmal eine Liste in der Strings gespeichert werden und füllen die mit ein paar Namen.

    Java-Quellcode

    1. List<String> namen = Arrays.asList("Karl", "Heinz", "Sissy", ..);
    Mit dieser Liste werden wir nun weiter arbeiten.

    Nehmen wir an wir wollen darüber Iterieren und den derzeitigen Eintrag ausgeben.
    Seit Java 1.5 haben wir dazu "normale" Schleifen genommen das würde dann so aussehen:

    Java-Quellcode

    1. for(int i = 0; i < namen.size(); i ++){
    2. String current = namen.get(i);
    3. System.out.println(current);
    4. }
    Ziemlich viel Code um nur die Datensätze ausgeben zu lassen, oder?
    Schauen wir uns das einmal mit Lambda an

    Java-Quellcode

    1. namen.stream().forEach(System.out::println);
    So schön so gut. Aber was haben wir hier gemacht?

    Gehen wir das mal durch also wir haben unsere Liste die wir vorhin erstellt haben genommen und mit forEach()sind wir alle Elemente durchgegangen. In den Klammen haben wir den einzelnen Eintrag deklariert (brauchen wir, sonst könnten wir damit nicht Arbeiten) und haben ihn einfach mit System.out.println() ausgegeben.

    In Lambda gibt es auch eine Methode mit der man Filtern kann. Dazu erstellen wir uns eine Klasse und nennen diese User. In der Klasse deklariere ich 2 Strings als Vor und Nachname und einen Integer für das Alter.

    Java-Quellcode

    1. public class User {
    2. private String Vorname, Nachname;
    3. private int alter;
    4. public User(String Vorname, String Nachname, int alter) {
    5. this.Vorname = Vorname;
    6. this.Nachname = Nachname;
    7. this.alter = alter;
    8. }
    9. public String getVorname() {
    10. return Vorname;
    11. }
    12. public String getNachname() {
    13. return Nachname;
    14. }
    15. public int getAlter() {
    16. return alter;
    17. }
    18. }
    Alles anzeigen
    Danach erstelle ich eine neue Liste mit ein paar Usern.


    Java-Quellcode

    1. List<User> users = Arrays.asList(
    2. new User("Karl", "Heinz", 57),
    3. new User("Sissy", "Franz", 32),
    4. new User("Alber", "Einstein", 337)
    5. );
    Jetzt wollen wir den ältesten User haben. Okay klingt nicht schwer, machen wir das mal mit einer normalen Schleife.


    Java-Quellcode

    1. int oldest = 0, higestAge = 0;
    2. for(int i = 0; i < users.size(); i ++){
    3. User user = users.get(i);
    4. if(user.getAlter() > highestAge){
    5. oldest = i;
    6. highestAge = user.getAlter();
    7. }
    8. }
    In der Schleife vergleichen wir einfach den Wert von highestAge mit dem Alter des derzeitigen Eintrages. Wenn dieses höher ist, wird highestAge auf den Wert des derzeitigen Eintrages gesetzt und oldest wird auf den Index des Objektes gesetzt. Für so eine einfache aufgabe brauchen wir 9 Zeilen an Code. Schauen wir uns das mal mit Lambda an.


    Java-Quellcode

    1. users.stream().max((user1, user2) -> Integer.compare(user1.getAlter(), user2.getAlter())).get();



    Mit einem lambda ausdruck ist es um einiges einfacher. Da brauchen wir einen Comperator der 2 Werte mit einander vergleicht und den höheren Eintrag zurückgibt damit der nächste Eintrag mit dem zurückgegebenen verglichen werden kann. Am ende bekommt man ein einfaches User Objekt zurück.

    Das war mal das Grundlegende in Lambda. Ich könnte jetzt noch auf die ganzen anderen Methoden eingehen aber das mach ich nicht jetzt. Vielleicht füge ich das einmal hinzu.


    Warum sollte man Lambda verwenden?
    Im Grunde ist es ganz einfach. Mit Lambda kann man den Code oft einfacher Lesen da er übersichtlicher im Gegensatz zu einer herkömmlichen Schleife ist. Ein großer Vorteil von Lambda ist auch das beim kompilieren vom Code keine weitere Klasse (innere Klasse) vom Kompiler mehr erstellt werden muss. Das spart Resourcen, auch wenn es nur wenige sind (aber es spart welche).

    Schlusswort
    Ich hoffe ich konnte das Thema verständlich rüber bringen (bin nicht gut im erklären). Wenn ihr Fragen, Anregungen oder Beschwerden habt weil etwas verbessert, geändert gehört oder werden kann dann bitte sagt mir das damit ich es ändern kann.

    210 mal gelesen

Kommentare 5

  • FelixBau -

    Sehr informativ, gerade um sich nochmal die Grundlagen anzuschauen. :)

  • Aquaatic -

    Mir fehlt hier ganz einfach folgendes: Wann kann ich Lambdas verwenden? Das was du hier zeigst sind eigentlich die Streams, die in Java 8 neu hinzugefügt wurden.

  • Scrayos -

    Mir fehlt hier etwas der Kontext. Ich würde mir hier eine Erläuterung der Consumer, Predicates und co wünschen. Gerade die Predicates lassen sich hervorragend mit der Prädikatenlogik verknüpfen. Dadurch würden sich die Ausdrücke auch umfassender präsentieren. Du hast hier nämlich keine Lambda-Einführung sondern eine Stream-Einführung gegeben.