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

Лямбда-вирази

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

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

Лямбда-вираз можна використовувати лише там, де потрібен Функціональний інтерфейс. Функціональний інтерфейс – це інтерфейс, який оголошує рівно один абстрактний метод. 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)` у виклику print.

Рішення доступне після 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 спроб