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.
Nasza obecna implementacja:
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:
Wynik wykonania kodu:
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:
Wynik wykonania kodu:
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):
Wynik wykonania kodu:
W ten sposób nasz kod uległ wielkiemu uproszczeniu...
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.