В каких основных сценариях применяются лямбда-выражения в Java?

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

Ответ

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

  1. Stream API для обработки коллекций:

    List<String> filtered = names.stream()
        .filter(name -> name.startsWith("A")) // Предикат
        .map(String::toUpperCase)             // Функция
        .collect(Collectors.toList());
  2. Работа с потоками выполнения (Concurrency):

    ExecutorService executor = Executors.newFixedThreadPool(2);
    executor.submit(() -> System.out.println("Task running")); // Runnable
    
    CompletableFuture.supplyAsync(() -> fetchDataFromNetwork()) // Supplier
                     .thenApply(data -> process(data));         // Function
  3. Сортировка и сравнение:

    Collections.sort(people, (p1, p2) -> p1.getAge() - p2.getAge());
    // Эквивалентно с Comparator.comparing:
    people.sort(Comparator.comparing(Person::getAge));
  4. Обработка событий (например, в Swing/JavaFX):

    button.addActionListener(event -> label.setText("Clicked!"));

Преимущества:

  • Краткость: Устраняет шаблонный код анонимных классов.
  • Читаемость: Позволяет писать код в более декларативном стиле.
  • Функциональное программирование: Открывает возможности для использования паттернов из ФП (map, filter, reduce).