Что такое лямбда-выражения в Java и когда их следует использовать?

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

Ответ

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

Основные преимущества:

  • Лаконичность: Уменьшают шаблонный код.
  • Читаемость: Позволяют писать код в более декларативном стиле.
  • Удобство: Идеально подходят для работы с Stream API и функциональными интерфейсами.

Типичные сценарии использования:

  1. Функциональные интерфейсы java.util.function:
    Predicate<String> isEmpty = s -> s == null || s.trim().isEmpty();
    Function<Integer, Integer> square = x -> x * x;
    Consumer<String> printer = System.out::println;
  2. Сортировка коллекций с Comparator:
    List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
    // Сравнение по длине строки
    names.sort((a, b) -> a.length() - b.length());
    // Эквивалент с методом-ссылкой и компаратором
    names.sort(Comparator.comparingInt(String::length));
  3. Обработка потоков данных (Stream API):
    List<Integer> numbers = List.of(1, 2, 3, 4, 5);
    List<Integer> evenSquares = numbers.stream()
                                       .filter(n -> n % 2 == 0) // Лямбда в фильтре
                                       .map(n -> n * n)         // Лямбда в маппере
                                       .collect(Collectors.toList());

Важные ограничения:

  • Лямбда-выражения могут захватывать только effectively final переменные из окружающего контекста (переменные, которые не изменяются после инициализации).
  • Для сложной многострочной логики лучше использовать метод или анонимный класс, так как лямбда может снизить читаемость.