Wyrażenia lambda
Spis treści
Czym są wyrażenia lambda
Wyrażenia lambda w Javie mogą być stosowane w miejscach, w których oczekiwany jest argument typu będącego interfejsem funkcyjnym. Brzmi to skomplikowanie, ale najprościej wytłumaczyć to na przykładzie. Załóżmy, że chcemy posortować pewną kolekcję:
List<String> names = Arrays.asList("Kasia", "Ania", "Zosia", "Bartek");
Możemy w tym celu wykorzystać metodę sort() klasy Collections. Przyjmuje ona jako argumenty kolekcję do posortowania i komparator ustalający porządek:
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareToIgnoreCase(o2);
}
});
Zapis taki jest trochę mało czytelny przez wykorzystanie klasy anonimowej. Interfejs Comparator jest jednak interfejsem funkcyjnym, posiada tylko jedną metodę abstrakcyjną compare(o1, o2) więc możemy sobie wyobrazić go jako funkcję, która przyjmuje dwa parametry i zwraca wartość typu int:
(String o1, String o2) -> int
W miejsce komparatora możemy więc wstawić wyrażenie lambda, które odpowiada sygnaturze takiej funkcji, np.:
(String s1, String s2) -> s1.compareToIgnoreCase(s2)
Kompilator jest w stanie w większości przypadków domyślić się typu argumentów na podstawie kontekstu, więc w rzeczywistości posłużyć się krótszym zapisem:
(s1, s2) -> s1.compareToIgnoreCase(s2)
Przykłady
package pl.javastart;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class ComparatorLambdaExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Kasia", "Ania", "Zosia", "Bartek");
//sortowanie aldabetyczne z uwzględnieniem wielkości liter
Collections.sort(names, (s1, s2) -> s1.compareToIgnoreCase(s2));
//metoda dorEach od Jav8 8 daje możliwości jak pętla for-each
//oczekuje argumentu typu java.util.function.Consumer, czyli
// (arg) -> void
names.forEach(arg -> System.out.println(arg));
}
}
Przykład na Github
Dyskusja i komentarze
Masz pytania do tego wpisu? Może chcesz się podzielić spostrzeżeniami? Zapraszamy dyskusji na naszej grupie na Facebooku.