Przejdź do głównej treści
eLearner.app
Moduł 7 · Lekcja 1 z 213/14 w kursie~12 min
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:

Code
@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:

Code
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:

Code
(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 instrukcji return.
Code
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 typu T i zwraca wartość logiczną boolean (metoda test(T t)).
  • Consumer<T>: przyjmuje argument typu T i wykonuje operację, nic nie zwracając (metoda accept(T t)).
  • Function<T, R>: przyjmuje argument typu T i zwraca wynik typu R (metoda apply(T t)).
  • Supplier<T>: nie przyjmuje argumentów i zwraca wartość typu T (metoda get()).

Spróbuj sam

Ćwiczenie#java.m7.l1.e1
Próby: 0Ładowanie...

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.

Ładowanie edytora...
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

Ćwiczenie#java.m7.l1.e2
Próby: 0Ładowanie...

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

Ładowanie edytora...
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

Ćwiczenie#java.m7.l1.e3
Próby: 0Ładowanie...

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

Ładowanie edytora...
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