Zielony Smok - logo witryny

Dlaczego lambda?

Lambda jest jedenastą literą alfabetu greckiego. W 1930 r. Antonio Church i Stephen C. Kleene wprowadzili do matematyki tzw. rachunek lambda, używany w informatyce do badania algorytmów. Rachunek lambda bada zagadnienie rekurencji, definiowalność funkcji, obliczalność, zastosowanie wartości logicznych oraz problemy definiowania niektórych podstawowych terminów matematycznych. Istnieje wiele różnych rachunków lambda, z których w informatyce najważniejsze są dwa:

  • rachunek lambda bez typów
  • rachunek lambda z typami

W rachunku lambda każde wyrażenie określa funkcję, która ma jeden argument, który sam jest funkcją jednoargumentową. Wartością funkcji też jest funkcja, która ma jeden argument. Wyrażenie lambda definiuje więc funkcję, która opisuje, co ta funkcja czyni z jej własnym argumentem.

Składnia wyrażeń lambda

Wyrażenie składa się z trzech elementów następujących po sobie:

  • lista parametrów wyrażenia otoczona nawiasami
  • strzałka (operator) – oddziela listę parametrów od ciała wyrażenia
  • ciało wyrażenia otoczone klamrami. Może zawierać jedną lub więcej instrukcji.

(lista parametrów) -> {ciało wyrażenia}

A oto przykład:

(int a, int b) -> {return a + b;}

Parametry oddzielone są przecinkami. Lista parametrów na ogół nie musi zawierać typów zmiennych – wystarczą nazwy zmiennych. Kompilator sam ustala typ zmiennych, tak że powyższe możemy zapisać też jako:

(a, b) -> {return a + b;}

Ciało wyrażenia może zawierać jedną lub kilka instrukcji. Jeżeli ciało wyrażenia zawiera tylko jedną instrukcję
można pominąć zarówno klamry jak i słowo kluczowe return:

(a, b) -> a + b

Jeśli lista parametrów składa się tylko z jednego parametru można pominąć nawiasy:

value -> System.out.println(value);

Jeżeli lista parametrów jest pusta umieszczamy puste nawiasy:

() -> System.out.println(„Witaj w świecie wyrażeń lambda”)

() -> 100;

Ciało wyrażenia, choć nie ma to wielkiego sensu, może być nawet puste:

()->{}

Jak widzimy powyżej wyrażenie lambda jest w zasadzie anonimową metodą (funkcją).

Domknięcia i rozwinięcie inline

Domknięcie i lambda są tereminami, które poza programowaniem funkcyjnym mogły być praktycznie używane zamiennie. W programowaniu funkcyjnym wyrażenie lambda uzyskuje nieco odmienne znaczenie. W Java 8 wyrażenie lambda jest funkcją inline (rozwijaną w miejscu wywoływania), która jednocześnie jest domknięciem ponieważ dziedziczy stan klasy i metody (czyli atrybuty klasy, parametry metody i zmienne lokalne), w której jest zdefiniowane.