Lekcje modułu (1/2)
Wyrażenia Lambda
Począwszy od Javy 8, wprowadzono wsparcie dla programowania funkcjonalnego dzięki Wyrażeniom Lambda (Lambda Expressions). Lambda to w zasadzie metoda anonimowa (funkcja bez nazwy), którą można przekazać jako argument do innych metod lub zapisać w zmiennej.
Interfejsy funkcjonalne
Wyrażenie lambda może być użyte tylko tam, gdzie wymagany jest interfejs funkcjonalny (Functional Interface). Jest to interfejs deklarujący dokładnie jedną metodę abstrakcyjną. Java oznacza te interfejsy opcjonalną adnotacją @FunctionalInterface.
Przykład interfejsu funkcjonalnego zdefiniowanego przez użytkownika:
@FunctionalInterface
interface MathOperation {
int operate(int a, int b);
}
Przed Javą 8 musielibyśmy zdefiniować klasę anonimową. Dzięki lambdom składnia skraca się do:
MathOperation addition = (a, b) -> a + b;
int result = addition.operate(5, 3); // Ritorna 8
Struktura wyrażeń lambda
Podstawowa składnia wyrażenia lambda to:
(parametri) -> { corpo }
- Bez parametrów:
() -> System.out.println("Hello") - Pojedynczy parametr:
x -> x * 2(nawiasy okrągłe można pominąć) - Więcej parametrów:
(x, y) -> x + y - Wieloliniowe ciało: jeśli ciało zawiera więcej instrukcji, wymagane są nawiasy klamrowe
{}oraz jawne użycie instrukcjireturn.
MathOperation detailedAddition = (a, b) -> {
System.out.println("Somma in corso...");
return a + b;
};
Standardowe interfejsy funkcjonalne w Javie
Pakiet java.util.function dostarcza wiele predefiniowanych interfejsów funkcjonalnych:
Predicate<T>: przyjmuje argument typuTi zwraca wartość logiczną boolean (metodatest(T t)).Consumer<T>: przyjmuje argument typuTi wykonuje operację, nic nie zwracając (metodaaccept(T t)).Function<T, R>: przyjmuje argument typuTi zwraca wynik typuR(metodaapply(T t)).Supplier<T>: nie przyjmuje argumentów i zwraca wartość typuT(metodaget()).
Spróbuj sam
Uzupełnij kod, tworząc instancję interfejsu Calculator za pomocą wyrażenia lambda, które sumuje dwie liczby całkowite. Następnie wywołaj metodę calculate, przekazując 5 i 3, i wypisz wynik na ekranie.
Pokaż wskazówkę
Zadeklaruj `Calculator adder = (a, b) -> a + b;`, a następnie wywołaj `adder.calculate(5, 3)` wewnątrz metody wypisywania.
Rozwiązanie dostępne po 3 próbach
Utwórz instancję standardowego interfejsu funkcjonalnego Predicate<String> o nazwie isLong, używając wyrażenia lambda sprawdzającego, czy długość ciągu znaków jest większa niż 5. Następnie wypisz wynik testu dla ciągu 'hello world'.
Pokaż wskazówkę
Wyrażenie lambda dla `Predicate<String>` przyjmuje parametr `s` i zwraca `s.length() > 5` jako warunek logiczny.
Rozwiązanie dostępne po 3 próbach
Posortuj alfabetycznie listę ciągów znaków names, wywołując na niej metodę sort() i przekazując wyrażenie lambda implementujące Comparator (przyjmujące dwa ciągi s1, s2 i porównujące je za pomocą compareTo).
Pokaż wskazówkę
Użyj `names.sort((s1, s2) -> s1.compareTo(s2));`, aby posortować listę w miejscu.
Rozwiązanie dostępne po 3 próbach