logo

Wyrażenie lambda w Javie

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>

wyrażenie lambdaSkładnia wyrażenia lambda

 lambda operator ->ciało>

Parametry wyrażenia lambda

Poniżej wymieniono trzy parametry wyrażenia lambda:

  1. Parametr zerowy
  2. Pojedynczy parametr
  3. 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?

  1. () -> {}
  2. () -> maniacy forgeeków
  3. () -> {zwróć geeksforgeeks;}
  4. (Liczba całkowita i) -> zwróć geeksforgeeks + i;
  5. (Ciąg s) -> {geeksforgeeks;}

Odpowiedź:

4 i 5 to nieprawidłowe lambdy, pozostałe są prawidłowe. Detale:

  1. Ta lambda nie ma parametrów i zwraca wartość void. Przypomina metodę z pustą treścią: public void run() { }.
  2. Ta lambda nie ma parametrów i zwraca ciąg jako wyrażenie.
  3. Ta lambda nie ma parametrów i zwraca ciąg znaków (przy użyciu jawnej instrukcji return w bloku).
  4. 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; }.
  5. 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; }.