Что такое лямбда-выражения (lambda functions) в Java?

«Что такое лямбда-выражения (lambda functions) в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Синтаксис: (параметры) -> { тело } или (параметры) -> выражение.

Примеры:

// 1. Сортировка списка с помощью лямбды
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.sort((a, b) -> a.compareTo(b));

// 2. Использование с Stream API
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
List<Integer> squares = numbers.stream()
                               .map(n -> n * n) // Лямбда как Function
                               .collect(Collectors.toList()); // [1, 4, 9, 16, 25]

// 3. Запуск потока (Runnable)
new Thread(() -> System.out.println("Запуск из лямбды")).start();

Ключевые особенности:

  • Целевой тип: Тип лямбды определяется из контекста (ожидаемый функциональный интерфейс: Comparator, Predicate, Function, Consumer и т.д.).
  • Захват переменных: Лямбда может использовать effectively final переменные из окружающей области видимости (локальные переменные, которые не изменяются после инициализации).
  • Ссылки на методы: Часто могут быть заменены на более лаконичные ссылки на методы (String::compareTo, System.out::println).

Функциональные интерфейсы (пакет java.util.function) — основа для лямбд:

  • Predicate<T> — проверка условия (t -> t > 5).
  • Function<T,R> — преобразование объекта (s -> s.length()).
  • Consumer<T> — выполнение действия (obj -> System.out.println(obj)).
  • Supplier<T> — поставщик значения (() -> new Object()).