Уроки модуля (1/2)
Лямбда-выражения
Начиная с Java 8, функциональное программирование поддерживается с помощью Лямбда-выражений. Лямбда-выражение — это, по сути, анонимный метод (функция без имени), который можно передавать в качестве аргумента методам или сохранять в переменных.
Функциональные интерфейсы
Лямбда-выражение можно использовать только там, где требуется Функциональный интерфейс. Функциональный интерфейс — это интерфейс, который объявляет ровно один абстрактный метод. 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)` внутри вызова печати.
Решение доступно после 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 попыток