Модульні уроки (1/2)
Лямбда-вирази
Починаючи з Java 8, функціональне програмування підтримується через Lambda Expressions. Лямбда-вираз — це, по суті, анонімний метод (функція без імені), який можна передати як аргумент методам або зберегти в змінних.
Функціональні інтерфейси
Лямбда-вираз можна використовувати лише там, де потрібен Функціональний інтерфейс. Функціональний інтерфейс – це інтерфейс, який оголошує рівно один абстрактний метод. Java позначає ці інтерфейси додатковою анотацією @FunctionalInterface.
Приклад функціонального інтерфейсу, визначеного користувачем:
@FunctionalInterface
interface MathOperation {
int operate(int a, int b);
}До Java 8 вам потрібно було визначити анонімний внутрішній клас. З лямбда-виразами синтаксис спрощено до:
MathOperation addition = (a, b) -> a + b;
int result = addition.operate(5, 3); // Returns 8Структура лямбда-виразів
Основний синтаксис лямбда такий:
(parameters) -> { body }
- Без параметрів:
() -> System.out.println("Hello") - Один параметр:
x -> x * 2(дужки можна опустити) - Кілька параметрів:
(x, y) -> x + y - Багаторядкове тіло: якщо тіло містить кілька операторів, потрібні дужки
{}та явний операторreturn.
MathOperation detailedAddition = (a, b) -> {
System.out.println("Adding...");
return a + b;
};Стандартні функціональні інтерфейси в Java
Пакет java.util.function надає кілька вбудованих функціональних інтерфейсів:
Predicate<T>: приймає аргумент типуTта повертає логічне значення (методtest(T t)).Consumer<T>: приймає аргумент типуTі виконує операцію без повернення результату (методaccept(T t)).Function<T, R>: приймає аргументTі повертає результатR(методapply(T t)).Supplier<T>: не приймає аргументів і повертає значення типуT(методget()).
Спробуйте самі
Завершіть код, створивши екземпляр інтерфейсу калькулятора за допомогою лямбда-виразу, який додає два цілі числа. Потім викличте метод обчислення, передаючи 5 і 3, і надрукуйте результат.
Показати підказку
Оголошіть `Calculator adder = (a, b) -> a + b;`, а потім викличте `adder.calculate(5, 3)` у виклику print.
Рішення доступне після 3 спроб
Створіть екземпляр стандартного функціонального інтерфейсу Predicate<String> під назвою isLong за допомогою лямбда-виразу, який перевіряє, чи довжина рядка перевищує 5 символів. Потім роздрукуйте результат тесту для «hello world».
Показати підказку
Лямбда для `Predicate<String>` приймає параметр `s` і повертає `s.length() > 5` як логічну умову.
Рішення доступне після 3 спроб
Відсортуйте список назв рядків за алфавітом, викликавши для нього метод sort() і передавши лямбда-вираз, який реалізує Comparator (взявши два рядки s1, s2 і порівнявши їх за допомогою compareTo).
Показати підказку
Використовуйте `names.sort((s1, s2) -> s1.compareTo(s2));`, щоб відсортувати список на місці.
Рішення доступне після 3 спроб