Перейти к основному содержимому
Модуль 7 · Урок 1 из 213/14 в курсе~12 min
Уроки модуля (1/2)

Лямбда-выражения

Начиная с Java 8, функциональное программирование поддерживается с помощью Лямбда-выражений. Лямбда-выражение — это, по сути, анонимный метод (функция без имени), который можно передавать в качестве аргумента методам или сохранять в переменных.

Функциональные интерфейсы

Лямбда-выражение можно использовать только там, где требуется Функциональный интерфейс. Функциональный интерфейс — это интерфейс, который объявляет ровно один абстрактный метод. Java помечает эти интерфейсы дополнительной аннотацией @FunctionalInterface.

Пример определяемого пользователем функционального интерфейса:

Java
@FunctionalInterface
interface MathOperation {
    int operate(int a, int b);
}

До Java 8 вам нужно было определить анонимный внутренний класс. При использовании лямбда-выражений синтаксис упрощается до:

Java
MathOperation addition = (a, b) -> a + b;
int result = addition.operate(5, 3); // Returns 8

Структура лямбда-выражений

Основной синтаксис лямбды:

Code
(parameters) -> { body }
  • Без параметров: () -> System.out.println("Hello")
  • Один параметр: x -> x * 2 (круглые скобки можно опустить)
  • Несколько параметров: (x, y) -> x + y
  • Многострочное тело: если тело содержит несколько операторов, необходимы фигурные скобки {} и явный оператор return.
Java
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()).

Попробуйте сами

Упражнение#java.m7.l1.e1
Попыток: 0Загрузка…

Завершите код, создав экземпляр интерфейса калькулятора, используя лямбда-выражение, которое добавляет два целых числа. Затем вызовите метод расчета, передав 5 и 3, и распечатайте результат.

Загрузка редактора…
Показать подсказку

Объявите `Calculator adder = (a, b) -> a + b;`, а затем вызовите `adder.calculate(5, 3)` внутри вызова печати.

Решение доступно после 3 попыток

Упражнение#java.m7.l1.e2
Попыток: 0Загрузка…

Создайте экземпляр стандартного функционального интерфейса Predicate<String> с именем isLong, используя лямбда-выражение, которое проверяет, превышает ли длина строки 5 символов. Затем распечатайте результат теста «Hello World».

Загрузка редактора…
Показать подсказку

Лямбда для Predicate<String> принимает параметр s и возвращает s.length() > 5 в качестве логического условия.

Решение доступно после 3 попыток

Упражнение#java.m7.l1.e3
Попыток: 0Загрузка…

Отсортируйте список имен строк в алфавитном порядке, вызвав для него метод sort() и передав лямбда-выражение, реализующее Comparator (берём две строки s1, s2 и сравниваем их с помощью CompareTo).

Загрузка редактора…
Показать подсказку

Используйте `names.sort((s1, s2) -> s1.compareTo(s2));` для сортировки списка на месте.

Решение доступно после 3 попыток