Lambda Ausdrücke #1 - Grundlagen

  • 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
    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
    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
    for(int i = 0; i < namen.size(); i ++){
    String current = namen.get(i);
    System.out.println(current);
    }

    Ziemlich viel Code um nur die Datensätze ausgeben zu lassen, oder?
    Schauen wir uns das einmal mit Lambda an

    Java
    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.


    Danach erstelle ich eine neue Liste mit ein paar Usern.



    Java
    List<User> users = Arrays.asList(
    new User("Karl", "Heinz", 57),
    new User("Sissy", "Franz", 32),
    new User("Alber", "Einstein", 337)
    );

    Jetzt wollen wir den ältesten User haben. Okay klingt nicht schwer, machen wir das mal mit einer normalen Schleife.



    Java
    int oldest = 0, higestAge = 0;
    for(int i = 0; i < users.size(); i ++){
    User user = users.get(i);
    if(user.getAlter() > highestAge){
    oldest = i;
    highestAge = user.getAlter();
    }
    }

    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
    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.

Teilen