Wyrażenia lambda #1

      5 komentarzy do Wyrażenia lambda #1

W wersji Java 8 pojawiła się charakterystyczna i tajemnicza strzałka „->” Nie oznacza ona bynajmniej kierunku pisania kodu w Javie 🙂  Strzałka ta jest symbolem wyrażeń lambda.

W prostych słowach wyrażenia lambda to funkcje anonimowe. Nie określałbym ich metodami, bo lambda wcale nie przynależy do konkretnej klasy jak metody w języku Java. Wyrażenie lambdy nie posiada także nazwy, nie muszą być zdefiniowane typy parametrów, nie muszą być nawet przekazane parametry,  posiada ciało i może zwracać konkretny typ lub nie. Ciekawostką jest to, że lambda może być przesłana do metody jako parametr lub przypisana do zmiennej. Jak widać lambda pozwala na duża ekspresję 🙂

W skrócie wyrażenie lambda to:

        • funkcja bez nazwy np:

      • nie musi posiadać typów parametrów:

    • nie musi posiadać parametrów:

    • nie musi posiadać czegokolwiek 😉

    • może coś zwracać:

      • może coś zwracać nawet bez return:

    • może nic nie zwracać:

    • można ją przypisać do zmiennej:

    • Zmienną można przekazać do metody:

Zapewne te przykłady jeszcze niczego konkretnego nie mówią, ale postaram się wyjaśnić to w dalszej części. Na początku omówmy jeszcze jak wygląda powołanie do życia lambdy:

Po lewej stronie mamy nazwę interfejsu funkcjonalnego, który wygląda tak:

Jest on niezbędny, żeby mogła powstać nasza funkcja anonimowa (lambda). O interfejsach funkcyjnych będę jeszcze pisał. Tak więc do zmiennej add przypisałem wyrażenie lambda. Parametry (a,b)  to parametry jakie będą przesłane do tego wyrażenia. Mogą one wyglądać również tak (int a, int b) jak w tradycyjnej metodzie, ale nie muszą 😉  Zauważcie, że lambda ma dokładnie tyle samo parametrów co zdefiniowana metoda w interfejsie.

Po strzałce, która tak czy siak wskazuje kierunek pisania, mamy ciało naszej funkcji, w której możemy wykonać pewne działania. Tutaj po prostu dodaję dwie przesłane liczby. Jeżeli będziemy chcieli umieścić więcej linii kodu, całe ciało musimy otoczyć nawiasami klamrowymi np:

Czyli mamy interfejs, a w nim zdefiniowaną metodę. Jak to w interfejsie. Za pomocą lambdy możemy przypisać do zmiennej add, która jest typem tego interfejsu, implementację jego metody wyrażeniem lambda. W tym przypadku jest to implementacja metody calculation(int a, int b). Możemy teraz wywołać metodę calculation z naszego interfejsu, która przekaże parametry do naszej lambdy i zrealizuje ją. Po prostu wywołujemy metodę calculation na obiekcie add, który jest typem naszego interfejsu.

Oczywiście, metodę tego interfejsu można zaimplementować przez klasę anonimową:

Jednak sami widzicie jak wiele zbędnego kodu trzeba stworzyć. Jest on mało czytelny i słabo testowalny. Nie polecam 🙂

Mam nadzieje, że wstęp do lambd wydaje się jasny, jeżeli coś nie jest jasne, piszcie w komentarzach. Na bieżąco będę starał się wyjaśniać. W następnym wpisie opiszę interfejs funkcjonalny bo jest on nierozłącznie związany z wyrażeniami lambda. A po tym zrobimy konkretny praktyczny odcinek z przykładami.

 

5 thoughts on “Wyrażenia lambda #1

  1. Maniek

    Może to źle, jednak stare klase anonimowe z mnóstwem kodu są dla mnie znacznie bardziej czytelne niż lambdy.

    Reply
    1. admin Post author

      Na początku lambdy i całe to funkcjonalne programowanie nie jest czytelne. Ale polecam używać i w końcu wszystko staje się czytelniejsze 🙂

      Reply
  2. Wiciorny

    A ja mam Ciekawe dosyć pytanie.
    jeśli Interfejs posiadać będzie tylko metode defaultową, dlaczego mogę tworzyć klase anonimową w stary sposób i przeciążyć tę metode, jednak z wyraźeń lambda nie koniecznie?

    interface ImplementByOveride{
    default String couldOvverride(){
    return „Hello im from interfece”;
    }
    przykład// mogę przeciążyć tworząc klasycznie anonimową klase, ale z wyrażeniem lambda nie da się

    Reply

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *