Java

Wyrażenie lambda w Java

Pojawia się w edycji 8 Java. Chociaż w wielu językach takich jak Scala, JS, C# wyrażenie inLine było można stosować już dawno temu.
Składnia ogólna wyrażenia
(parametry_funkcji) -> {ciało_metody}
Np.:
(int x, int y) -> {return x + y;}
Powyższe wyrażenie przyjmuje na wejściu wartości typu całkowitego, a następnie zwraca ich sumę.

Innym przykładem może być zastosowanie bardziej generycznego wyrażenia:
(x, y) -> {return x + y;}
Wówczas, w zależności od przyjmowanych parametrów wejściowych, otrzymujemy wynik. Mogą być to liczby całkowite, zmiennoprzecinkowe. W tym przypadku nie wyklucza się również zmiennych typu String. Po takim zabiegu otrzymamy skonkatenowany łańcuch znakowy.
Stosowanie wyrażeń lambda ma ogromną zaletę w programowaniu – oszczędzanie zapisanych linijek kodu.
Rozważmy następujący przykład:

Poniżej metoda, która przyjmuje listę osób oraz minimalny wiek, jaki muszą posiadać do ich wypisania. Zadanie jest banalnie proste, gdyż wystarczy jedna instrukcja warunkowa.

public static void printPersonsOlderThan(ArrayList roster, int age) {
 for (Person p : roster) {
 if (p.getAge() >= age) {
 p.printPerson();
 }
 }
}

Zadanie komplikuje się wtedy, kiedy nasza metoda zacznie przyjmować więcej kryteriów wymaganych do wypisania osób. Wtedy czeka nas długi blok instrukcji, w którym łatwo się jest pogubić.

public static void printPersonsOlderThan(ArrayList roster, int age, int height, int weight) {
    for (Person p : roster) {
        // problem 🙁
    }
}
Zbawieniem jest wyrażenie lambda, która upraszcza nam cały proces zadnia:

public static void printPersonsOlderThan(ArrayList roster, int age, int height, int weight) {
roster.stream().filter(p -> p.getAge > age &&
p.getHeight > height &&
p.getWeight > weight)
.forEach(Person:: printPerson);
}

Teraz już nie potrzebujemy używać nawet pętli foreach. Wystarczy, że na liście utworzymy obiekt p, który będzie spełniał powyższe 3 warunki. Wówczas zostaną zgromadzone tylko wyselekcjonowane elementy. Na tych elementach możemy bezpośrednio wywołać metodę printPerson, jak widać to powyżej.

Tags:
Show Buttons
Hide Buttons