Освоюємо Java/Лямбда-вирази
Лямбда-вираз - це специфічна реалізація анонімного методу, який визначений в функціональному інтерфейсі. Лямбда-вираз появились у 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)
}
Лямбда-вирази можна використовувати в якості аргументу методу, що викликається. Лямбда-вирази можуть генерувати винятки, які повинні бути зазначені при оголошенні абстрактного методу функціонального інтерфейсу.
Посилання на методи
[ред.](ще не написано)