Java 8 – wyrażenia lambda
Java 8 – wyrażenia lambda
Wyrażenia lambda to wyrażenia (funkcje anonimowe) wykorzystywane z użyciem interfejsów funkcyjnych czyli takich które posiadają dokładnie jedną metodę. W praktyce interfejsy te oznaczane są adnotacją @FunctionalInterface. Adnotacja ta uniemożliwia zdefiniowanie więcej niż jednej metody w interfejsie funkcyjnym powodując błąd kompilacji. Dodatkowo pełni ona funkcje markującą. Wyrażenia lambda pozwalają na pisanie kodu szybko i czytelnie. Poniżej zamieszczony interfejs:
interface Operation { int doOperation(int a, int b); }
może być zaimplementowany na 3 różne sposoby:
- utworzenie nowej klasy i zaimplementowanie interfejsu Operation,
- użycie klasy anonimowej,
- użycie wyrażenia lambda.
Utworzenie nowej klasy i zaimplementowanie interfejsu jest oczywiste, przykład z użyciem klasy anonimowej (tworzenie jedynej instancji klasy w miejscu jej użycia):
Operation addition = new Operation() { @Override public int doOperation(int a, int b) { return a + b; } }; System.out.println(addition.doOperation(2,2));
Składnia ogólna wyrażeń lambda:
parameter -> expression body
Przykłady z użyciem wyrażeń lambda:
Kompilator na podstawie typu argumentów zadeklarowanych w metodzie w interfejsie jest w stanie domyślić się typów zmiennych:
Operation subtraction = (x,y) -> x -y; System.out.println(subtraction.doOperation(2,2));
nie trzeba zatem ich deklarować jak poniżej:
Operation multiply = (int x , int y) -> (x * y); System.out.println(multiply.doOperation(2,2));
Operation division = (int x , int y) -> (x / y); System.out.println(division.doOperation(2,2));
Jeśli wyrażenie lambda ma zawierać więcej niż jedną linię to należy użyć nawiasów klamrowych. Jednak zalecałbym tutaj przemyśleć czy nie należało by napisać zwykłej metody zamiast wyrażenia lambda.
Operation additionWithLambda = (int x , int y) -> {return x + y;}; System.out.println(additionWithLambda.doOperation(2,2));
Użycie konstrukcji method references:
Metod references to uproszczony zapis wyrażenia lambda:
class OperationImplAddition { int doOperation(int a, int b) { return a + b; } } class OperationImplSubtraction { static int doOperation(int a, int b) { return a - b; } }
Implementacja z użyciem method references:
OperationImplAddition operationImplAddition = new OperationImplAddition(); Operation operation = operationImplAddition::doOperation; System.out.println(operation.doOperation(2,2)); Operation operationSubtraction = OperationImplSubtraction::doOperation; System.out.println(operationSubtraction.doOperation(2,2));
Klasycznym przykładem użycia konstrukcji method references jest:
System.out::println
zamiast klasycznego:
System.out.println();
Wpis bardzo konkretny i łatwy w odbiorze. Uzupełniłbym go jeszcze o referencje do metod oraz użycie this w kontekscie wyrażeń lamba o czym można przeczytać na http://javadeveloper.pl/wyrazenia-lambda-w-jezyku-java/
Cześć Alina, dzięki za trafny komentarz!