Kurs Java

Wyrażenia lambda - Starter

Kurs zaczniemy od wyjaśnienia, skąd się biorą wyrażenia lambda i jaki ma to związek z klasami anonimowymi, które istnieją w Javie od bardzo, bardzo dawna.

Wstęp do klas anonimowych

W rozdziale Interfejsy pokazaliśmy, czym jest interfejs w Javie oraz w jaki sposób należy go zaimplementować. Przypomnijmy sobie, jak to wyglądało. Najpierw stworzyliśmy kod samego interfejsu, a następnie kod implementacji w postaci klasy MovieItem. Na potrzeby tego przykładu uprościmy interfejs, tak aby posiadał jedną metodę abstrakcyjną - getDescription.
public interface Item {     

    String getDescription();
} 
Nasza obecna implementacja:
public class MovieItem implements Item {

    public String getDescription() {
        return "This is description for MovieItem";
    }
} 
To, na co chcemy tutaj zwrócić uwagę, to że klasa MovieItem jest klasą publiczną zlokalizowaną w osobnym pliku. Zatem, jeśli powołujemy obiekt takiej klasy w innym miejscu programu, na przykład w klasie Start, wówczas nie widzimy bezpośrednio implementacji wywoływanej metody:
public class Start {

    public static void main(String[] args) {

        Item item = new MovieItem();
        String description = item.getDescription();
        System.out.println(description);
    }
}    
Wynik wykonania kodu:
Java 8 - Data i czas przed Javą 8
Innymi słowy, nie wiemy, co dokładnie znajduje się w metodzie klasy MovieItem, dopóki nie zajrzymy do tej klasy. Z drugiej strony, gdy zajrzymy do którejś z metod klasy, to przestaniemy widzieć kod naszego procesu w klasie Start. W Javie istnieje jednak rozwiązanie, które pozwala na zaimplementowanie metody od razu w kontekście wykonywanego kodu. Jest ono punktem zaczepienia w drodze prowadzącej do poznania idei wyrażeń lambda.
Appa Notka. W kodzie Javy istnieje sporo interfejsów, które mają tylko jedną metodę abstrakcyjną. Najpopularniejszym z nich jest Comparator, który deklaruje metodę compare. Odpowiednia implementacja tej metody pozwala na określenie sposobu sortowania obiektów implementowanych przez ten interfejs. Inne znane interfejsy z jedną metodą to na przykład: Runnable, Callable lub FileFilter. Niedługo (jeszcze w tym rozdziale) wyjaśni się, dlaczego interesują nas interfejsy z jedną metodą abstrakcyjną.

Klasy anonimowe

W Javie możemy zaimplementować ciało metod interfejsu (lub klasy abstrakcyjnej) bez tworzenia osobnego pliku z nazwaną klasą publiczną. Robimy to poprzez zbudowanie klasy anonimowej. Klasa taka, jak sama nazwa wskazuje, nie posiada nazwy, a do tego może być implementowana w miejscu użycia. Zobaczmy, jak to wygląda w naszym przykładzie:
 
public class Start {     

    public static void main(String[] args) {
    
        Item item = new Item() {
        
            public String getDescription() {
                return "This is description for MovieItem";
            }
        };
        String description = item.getDescription();
        System.out.println(description);
    }  
}    
Wynik wykonania kodu:
Java 8 Wynik wykonania kodu - Klasy anonimowe
Bardzo charakterystyczne w klasach anonimowych jest to, że na pierwszy rzut oka wygląda, jakbyśmy tworzyli obiekt interfejsu, w tym przypadku obiekt interfejsu Item. W rzeczywistości konstrukcja new Item użyta wraz z blokiem kodu mówi Javie, by została stworzona klasa i żeby na jej bazie powstał obiekt. Tak więc kod, który widzimy na obrazku między nawiasami klamrowymi, jest kodem klasy anonimowej, z której powstaje obiekt używany przez nas dalej w programie.

Dobrze. Skoro wiemy już co to klasa anonimowa i do czego się przydaje, możemy pójść dalej. Obieramy kierunek na Javę 8 i rozwiązanie, które nazywamy wyrażeniem lambda.

Wyrażenie lambda

Klasy anonimowe dają co prawda fajną możliwość implementacji interfejsu w miejscu wykonywanego algorytmu, ale jednak nie można pominąć faktu, że ich implementacja wymaga wytworzenia sporej ilości powtarzalnego kodu. Na szczęście programiści Javy wprowadzili rozwiązanie, które znacznie upraszcza taki kod, a co więcej, staje się podstawowym wzorcem w tworzeniu programów.

Zmodyfikujemy teraz nasz przykład z klasą anonimową, tak by zamiast tej klasy pojawiło się wyrażenie lambda. W tym celu usuwamy zbędne fragmenty kodu, a pozostawiamy samą esencję w postaci nawiasów z ewentualnymi parametrami oraz zawartością metody (kod wykonawczy):
public class Start {     

    public static void main(String[] args) {
    
        Item item = new Item() {
        
            public String getDescription() {
                return "This is description for MovieItem";
            }
        };
        String description = item.getDescription();
        System.out.println(description);
    }  
}    
Wynik wykonania kodu:
Java 8 Wynik wykonania kodu - Wyrażenie lambda
W ten sposób nasz kod uległ wielkiemu uproszczeniu...
Masz pytanie dotyczące tego rozdziału? Zadaj je nam!
Masz pytanie dotyczące prezentowanego materiału?
Coś jest dla Ciebie niejasne i Twoje wątpliwości przeszkadzają Ci w pełnym zrozumieniu treści?
Napisz do nas maila, a my chętnie znajdziemy odpowiednie rozwiązanie.
Najciekawsze pytania wraz z odpowiedziami będziemy publikować pod rozdziałem.
Nie czekaj. Naucz się programować jeszcze lepiej.
kursjava@javappa.com

Stale się rozwijamy, a więc bądź na bieżąco!
Na ten adres będziemy przesyłać informacje o ważniejszych aktualizacjach, a także o nowych materiałach pojawiających się na stronie.
Polub nas na Facebooku:
Nasi partnerzy: stackshare
Javappa to również profesjonalne usługi programistyczne oparte o technologie JAVA. Jeśli chesz nawiązać z nami kontakt w celu uzyskania doradztwa bądź stworzenia aplikacji webowej powinieneś poznać nasze doświadczenia.
Kliknij O nas .


Pozycjonowanie stron: Grupa TENSE