Wyrażenia lambda w języku Java
Wyrażenia lambda w języku Java
Wyrażenia lambda zostały dodane w Javie 8.
Wyrażenie lambda to krótki blok kodu, który pobiera parametry i zwraca wartość. Wyrażenia lambda są podobne do metod, ale nie wymagają nazwy i można je zaimplementować bezpośrednio w treści metody.
Składnia
Najprostsze wyrażenie lambda zawiera jeden parametr i wyrażenie:
parameter -> expression
Aby użyć więcej niż jednego parametru, umieść je w nawiasach:
(parameter1, parameter2) -> expression
Wyrażenia są ograniczone. Muszą natychmiast zwrócić wartość i nie mogą zawierać zmiennych, przypisań ani instrukcji, takich jak if
lub for
. Aby wykonać bardziej złożone operacje, można użyć bloku kodu z nawiasami klamrowymi. Jeśli wyrażenie lambda musi zwrócić wartość, blok kodu powinien zawierać return
instrukcję.
(parameter1, parameter2) -> { code block }
Korzystanie z wyrażeń lambda
Wyrażenia lambda są zwykle przekazywane jako parametry do funkcji:
Przykład
Użyj wyrażenia lamba w ArrayList
metodzie forEach()
, aby wydrukować każdy element na liście:
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<Integer>();
numbers.add(5);
numbers.add(9);
numbers.add(8);
numbers.add(1);
numbers.forEach( (n) -> { System.out.println(n); } );
}
}
Wyrażenia lambda mogą być przechowywane w zmiennych, jeśli typem zmiennej jest interfejs, który ma tylko jedną metodę. Wyrażenie lambda powinno mieć taką samą liczbę parametrów i taki sam typ zwracany jak ta metoda. Java ma wiele wbudowanych tego rodzaju interfejsów, takich jak Consumer
interfejs (znajdujący się w java.util
pakiecie) używany przez listy.
Przykład
Użyj Consumer
interfejsu Java do zapisania wyrażenia lambda w zmiennej:
import java.util.ArrayList;
import java.util.function.Consumer;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<Integer>();
numbers.add(5);
numbers.add(9);
numbers.add(8);
numbers.add(1);
Consumer<Integer> method = (n) -> { System.out.println(n); };
numbers.forEach( method );
}
}
Aby użyć wyrażenia lambda w metodzie, metoda powinna mieć parametr z interfejsem jednej metody jako jej typ. Wywołanie metody interfejsu spowoduje uruchomienie wyrażenia lambda:
Przykład
Utwórz metodę, która jako parametr przyjmuje wyrażenie lambda:
interface StringFunction { String run(String str);
}public class Main { public static void main(String[] args) { StringFunction exclaim = (s) -> s + "!"; StringFunction ask = (s) -> s + "?"; printFormatted("Hello", exclaim); printFormatted("Hello", ask);
}public static void printFormatted(String str, StringFunction format) { String result = format.run(str); System.out.println(result);
}}