W Javie wyrażenia Lambda zasadniczo wyrażają instancje interfejsów funkcjonalnych (interfejs z pojedynczą metodą abstrakcyjną nazywany jest interfejsem funkcjonalnym). Wyrażenia lambda w Javie są takie same jak funkcje lambda, które są krótkim blokiem kodu, który akceptuje dane wejściowe jako parametry i zwraca wartość wynikową. Wyrażenia lambda zostały niedawno uwzględnione w Java SE 8.
Funkcjonalności wyrażenia Lambda w Javie
Wyrażenia Lambda implementują jedyną funkcję abstrakcyjną i dlatego implementują interfejsy funkcjonalne. Wyrażenia lambda zostały dodane w Javie 8 i zapewniają poniższe funkcjonalności.
- Włącz traktowanie funkcjonalności jako argumentu metody lub kodu jako danych.
- Funkcja, którą można utworzyć nie należąc do żadnej klasy.
- Wyrażenie lambda można przekazywać tak, jakby było obiektem i wykonywać je na żądanie.
Przykład wyrażenia Lambda w Javie
Jawa // Java program to demonstrate lambda expressions // to implement a user defined functional interface. // A sample functional interface (An interface with // single abstract method interface FuncInterface { // An abstract function void abstractFun(int x); // A non-abstract (or default) function default void normalFun() { System.out.println('Hello'); } } class Test { public static void main(String args[]) { // lambda expression to implement above // functional interface. This interface // by default implements abstractFun() FuncInterface fobj = (int x)->System.out.println(2*x); // To wywołuje powyższe wyrażenie lambda i wyświetla 10. fobj.abstractFun(5); } }>
Wyjście
10>
Składnia wyrażenia lambda
lambda operator ->ciało>
Parametry wyrażenia lambda
Poniżej wymieniono trzy parametry wyrażenia lambda:
- Parametr zerowy
- Pojedynczy parametr
- Wiele parametrów
1. Wyrażenie lambda z parametrem Zero
() ->System.out.println('Parametr zerowy lambda');>
2. Wyrażenie lambda z pojedynczym parametrem
(p) ->System.out.println('Jeden parametr: ' + p);>
Używanie nawiasów nie jest obowiązkowe, jeśli typ tej zmiennej można wywnioskować z kontekstu
Jawa // A Java program to demonstrate simple lambda expressions import java.util.ArrayList; class Test { public static void main(String args[]) { // Creating an ArrayList with elements // {1, 2, 3, 4} ArrayList arrL = nowa lista tablic (); arrL.add(1); arrL.add(2); arrL.add(3); arrL.add(4); // Użycie wyrażenia lambda do wydrukowania wszystkich elementów // arrL arrL.forEach(n -> System.out.println(n)); // Użycie wyrażenia lambda do wydrukowania elementów parzystych // arrL arrL.forEach(n -> { if (n % 2 == 0) System.out.println(n); }); } }>
Wyjście
1 2 3 4 2 4>
Notatka: że wyrażeń lambda można używać wyłącznie do implementowania interfejsów funkcjonalnych. W powyższym przykładzie również implementowane jest wyrażenie lambda Konsument Funkcjonalny interfejs.
3. Wyrażenie lambda z wieloma parametrami
(p1, p2) ->System.out.println('Wiele parametrów: ' + p1 + ', ' + p2);>
Program w języku Java demonstrujący działanie wyrażenia lambda z dwoma argumentami.
Jawa // Java program to demonstrate working of lambda expressions public class Test { // operation is implemented using lambda expressions interface FuncInter1 { int operation(int a, int b); } // sayMessage() is implemented using lambda expressions // above interface FuncInter2 { void sayMessage(String message); } // Performs FuncInter1's operation on 'a' and 'b' private int operate(int a, int b, FuncInter1 fobj) { return fobj.operation(a, b); } public static void main(String args[]) { // lambda expression for addition for two parameters // data type for x and y is optional. // This expression implements 'FuncInter1' interface FuncInter1 add = (int x, int y) ->x + y; // mnożenie wyrażenia lambda przez dwa // parametry To wyrażenie implementuje również // interfejs 'FuncInter1' FuncInter1 multiply = (int x, int y) -> x * y; // Tworzenie obiektu Testu do wywołania operacji przy użyciu // różnych implementacji przy użyciu lambda // Wyrażenia Test tobj = new Test(); // Dodaj dwie liczby, używając wyrażenia lambda System.out.println('Dodawanie to ' + tobj.operate(6, 3, add)); // Pomnóż dwie liczby za pomocą wyrażenia lambda System.out.println('Mnożenie to ' + tobj.operate(6, 3, multiply)); // wyrażenie lambda dla pojedynczego parametru // To wyrażenie implementuje interfejs 'FuncInter2' FuncInter2 fobj = wiadomość -> System.out.println('Hello ' + wiadomość); fobj.sayMessage('Geek'); } }>
Wyjście
Addition is 9 Multiplication is 18 Hello Geek>
Notatka: Wyrażenia lambda są jak funkcje i akceptują parametry tak samo jak funkcje.
Wniosek
Poniżej wymieniono niektóre ważne punkty z tego artykułu:
- Treść wyrażenia lambda może zawierać zero, jedną lub więcej instrukcji.
- W przypadku pojedynczej instrukcji nawiasy klamrowe nie są obowiązkowe, a typ zwracany przez funkcję anonimową jest taki sam, jak w przypadku wyrażenia treści.
- Jeśli istnieje więcej niż jedna instrukcja, należy ją ująć w nawiasy klamrowe (blok kodu), a typ zwracany przez funkcję anonimową jest taki sam, jak typ wartości zwracanej w bloku kodu, lub void, jeśli nic nie zostanie zwrócone .
Często zadawane pytania w wyrażeniu Lambda
Pytanie 1. Jaki typ wyrażenia lambda Java?
Odpowiedź:
Wyrażenia Java Lambda to krótki blok kodu, który akceptuje dane wejściowe jako parametry i zwraca wartość wynikową.
Pytanie 2. Czy dobrze jest używać wyrażeń lambda w Javie?
Odpowiedź:
Tak, użycie wyrażeń lambda ułatwia korzystanie i obsługę innych interfejsów API.
Pytanie 3. Jakie są wady lambdy w Javie?
Odpowiedź:
Funkcji lambda języka Java można używać wyłącznie z interfejsami funkcjonalnymi.
Pytanie 4. Na podstawie pokazanych właśnie reguł składni, które z poniższych jest/nie jest prawidłowymi wyrażeniami lambda?
- () -> {}
- () -> maniacy forgeeków
- () -> {zwróć geeksforgeeks;}
- (Liczba całkowita i) -> zwróć geeksforgeeks + i;
- (Ciąg s) -> {geeksforgeeks;}
Odpowiedź:
4 i 5 to nieprawidłowe lambdy, pozostałe są prawidłowe. Detale:
- Ta lambda nie ma parametrów i zwraca wartość void. Przypomina metodę z pustą treścią: public void run() { }.
- Ta lambda nie ma parametrów i zwraca ciąg jako wyrażenie.
- Ta lambda nie ma parametrów i zwraca ciąg znaków (przy użyciu jawnej instrukcji return w bloku).
- return jest instrukcją przepływu sterowania. Aby ta lambda była poprawna, wymagane są nawiasy klamrowe w następujący sposób: (Liczba całkowita i) -> { return geeksforgeeks + i; }.
- geeks dla geeków to wyrażenie, a nie stwierdzenie. Aby ta lambda była poprawna, możesz usunąć nawiasy klamrowe i średnik w następujący sposób: (Ciąg s) -> maniacy dla maniaków. Lub, jeśli wolisz, możesz użyć jawnej instrukcji return w następujący sposób: (String s) -> { return maniacy dla maniaków; }.