Лямбда-вираз - це специфічна реалізація анонімного методу, який визначений в функціональному інтерфейсі. Лямбда-вираз появились у Java 8.
Лямбда-вирази та функціональний інтерфейс Функціональний інтерфейс – це інтерфейс, який зазначає лише один метод для реалізації. Прикладами функціональних інтерфейсів є інтерфейс Runnable (визначає лише один метод run()), ActionListener (метод actionPerformed()), Comparable (compareTo()), Comparator (compare()) тощо.
Лямбда вирази внесли у Java новий оператор -> (лямда оператор або оператор-стрілка). Зліва від оператора вказуються параметри методу функціонального інтерфейсу, а справа від стрілки вказується реалізація даного методу.
Допустимо ми маємо оголошений інтерфейс з одним реалізовуваним методом: interface MyNumber{ double getValue(); } Реалізувати інтерфейс ми можемо трьома способами. Перший спосіб: в окремому файлі створюємо клас, який реалізовує наш інтерфейс: public class ImpMyNumber implements MyNumber{ @Override public double getValue() { return 3.14; } public static void main(String[] args) { ImpMyNumber myNum=new ImplMyNumber(); System.out.println(myNum.getValue());
Другий спосіб: використовуємо анонімний клас: public class TestAnonymous { public static void main(String[] args) { MyNumber myNum=new MyNumber() { @Override public double getValue() { return 3.14;
System.out.println(myNum.getValue());
Третій спосіб – це використання власне лямбда-виразу: public class TestLamda { public static void main(String[] args) { MyNumber myNum; myNum=()->3.14; //лямбда-вираз System.out.println(myNum.getValue());
Як бачимо третій спосіб – найкоротший. Зверніть увагу на myNum2=()->3.14. В дужках у нас нічого не має, оскільки наш метод не приймає ніякі параметри. Справа від оператора-стрілки ми маємо число, яке повертається методом getValue(). Можна ускладнити лямбда вираз, наприклад, так: myNum=()->Math.random*10; Тим, що повертається повинен бути сумісний з типом зазначеним при оголошенні абстрактного методу функціонального інтерфейсу.
Лямбда вираз може складатися з кількох інструкцій. Таки лямда-вирази називаються блоковими або ж блочними. Блок коду тоді оточується фігурними дужками {код}; interface Sum{ double getSum(double n1, double n2); }
public class TestLamda { public static void main(String[] args) { Sum mySum=(n1,n2)->{ System.out.println("Сумуємо числа..."); double sum=n1+n2; return sum;
double myNum1=2.2; double myNum2=20.1; mySum.getSum(myNum1, myNum2);
Функціональний інтерфейс може бути узагальненим, тоді можна використовувати лямбда-вирази з різними типами, що повертаються і різнотипними параметрами методів: Interface SomeInt{ T m(T t) } Лямбда-вирази можна використовувати в якості аргументу методу, що викликається. Лямбда-вирази можуть генерувати винятки, які повинні бути зазначені при оголошенні абстрактного методу функціонального інтерфейсу.
Посилання на методи (ще не написано)