Перейти до вмісту

Освоюємо 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)
}

Лямбда-вирази можна використовувати в якості аргументу методу, що викликається. Лямбда-вирази можуть генерувати винятки, які повинні бути зазначені при оголошенні абстрактного методу функціонального інтерфейсу.

Посилання на методи

[ред.]

(ще не написано)

Паралелізм