Лямбда-вираз в Java
У Java лямбда-вирази в основному виражають екземпляри функціональних інтерфейсів (інтерфейс з одним абстрактним методом називається функціональним інтерфейсом). Лямбда-вирази в Java — це те саме, що лямбда-функції, які є коротким блоком коду, який приймає вхідні дані як параметри та повертає результуюче значення. Лямбда-вирази нещодавно включено до Java SE 8.
Функціональні можливості лямбда-виразу в Java
Лямбда-вирази реалізують єдину абстрактну функцію і, отже, реалізують функціональні інтерфейси Лямбда-вирази додаються в Java 8 і забезпечують наведені нижче функції.
- Увімкніть обробку функцій як аргумент методу або код як дані.
- Функція, яку можна створити, не належачи до жодного класу.
- Лямбда-вираз можна передавати так, ніби це об’єкт, і виконувати на вимогу.
Приклад лямбда-виразу Java
Java // 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); // Це викликає вищезгаданий лямбда-вираз і друкує 10. fobj.abstractFun(5); } } Вихід
10
Синтаксис лямбда-виразу
lambda operator ->тіло
Параметри лямбда-виразу
Нижче наведено три параметри лямбда-виразу:
- Нульовий параметр
- Єдиний параметр
- Кілька параметрів
1. Лямбда-вираз із нульовим параметром
() ->System.out.println('Нульовий параметр лямбда'); 2. Лямбда-вираз з одним параметром
(p) ->System.out.println('Один параметр: ' + p); Використовувати дужки необов’язково, якщо тип цієї змінної можна визначити з контексту
Java // 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 = новий ArrayList (); arrL.add(1); arrL.add(2); arrL.add(3); arrL.add(4); // Використання лямбда-виразу для друку всіх елементів // arrL arrL.forEach(n -> System.out.println(n)); // Використання лямбда-виразу для друку парних елементів // arrL arrL.forEach(n -> { if (n % 2 == 0) System.out.println(n); }); } } Вихід
1 2 3 4 2 4
Примітка: що лямбда-вирази можна використовувати лише для реалізації функціональних інтерфейсів. У наведеному вище прикладі також реалізується лямбда-вираз Споживач Функціональний інтерфейс.
3. Лямбда-вираз із кількома параметрами
(p1, p2) ->System.out.println('Кілька параметрів: ' + p1 + ', ' + p2); Програма Java для демонстрації роботи лямбда-виразу з двома аргументами.
Java // 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) ->х + у; // множення лямбда-виразу для двох // параметрів Цей вираз також реалізує // інтерфейс 'FuncInter1' FuncInter1 multiply = (int x, int y) -> x * y; // Створення об’єкта Test для виклику оператора за допомогою // різних реалізацій за допомогою лямбда // Вирази Test tobj = new Test(); // Додайте два числа за допомогою лямбда-виразу System.out.println('Addition is ' + tobj.operate(6, 3, add)); // Множення двох чисел за допомогою лямбда-виразу System.out.println('Множення є ' + tobj.operate(6, 3, multiply)); // лямбда-вираз для одного параметра // Цей вираз реалізує інтерфейс 'FuncInter2' FuncInter2 fobj = message -> System.out.println('Hello ' + message); fobj.sayMessage('Виродок'); } } Вихід
Addition is 9 Multiplication is 18 Hello Geek
Примітка: Лямбда-вирази схожі на функції, і вони приймають параметри, як і функції.
Висновок
Нижче наведено кілька важливих пунктів із цієї статті:
- Тіло лямбда-виразу може містити нуль, один або більше операторів.
- Якщо є один оператор, фігурні дужки не є обов’язковими, а тип повернення анонімної функції такий самий, як і для виразу body.
- Якщо існує більше одного оператора, вони повинні бути взяті у фігурні дужки (блок коду), а тип повернення анонімної функції такий самий, як і тип значення, що повертається в блоці коду, або недійсний, якщо нічого не повертається .
Поширені запитання щодо лямбда-виразу
Q1. Який тип лямбда-виразу Java?
відповідь:
Лямбда-вирази Java — це короткий блок коду, який приймає вхідні дані як параметри та повертає результуюче значення.
Q2. Чи добре використовувати лямбда-вирази в Java?
відповідь:
Так, використання лямбда-виразів полегшує використання та підтримку інших API.
Q3. Які недоліки Java lambda?
відповідь:
Лямбда-функції Java можна використовувати лише з функціональними інтерфейсами.
Q4. На основі щойно показаних правил синтаксису, що з наведеного нижче є/є НЕдійсним лямбда-виразом?
- () -> {}
- () -> geeksforgeeks
- () -> { return geeksforgeeks;}
- (Ціле i) -> повернути geeksforgeeks + i;
- (Рядок s) -> {geeksforgeeks;}
відповідь:
4 і 5 недійсні лямбда-вирази, решта дійсні. Подробиці:
- Ця лямбда не має параметрів і повертає void. Це схоже на метод із порожнім тілом: public void run() { }.
- Ця лямбда не має параметрів і повертає рядок як вираз.
- Ця лямбда не має параметрів і повертає рядок (використовуючи явний оператор return у блоці).
- return — оператор потоку керування. Щоб зробити цей лямбда дійсним, потрібні такі фігурні дужки: (Integer i) -> { return geeksforgeeks + i; }.
- гіки для гіків – це вираз, а не твердження. Щоб зробити цей лямбда дійсним, ви можете видалити фігурні дужки та крапку з комою таким чином: (Рядок s) -> geeks для geeks. Або, якщо хочете, ви можете використати явний оператор повернення таким чином: (String s) -> { return geeks for geeks; }.