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();


2 Comments

  1. 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/

  2. marcin warycha - javaleader.pl 31 lipca 2019 at 14:18

    Cześć Alina, dzięki za trafny komentarz!

Leave a comment

Your email address will not be published.


*