Лямбда-выражения (Lambda Expressions) — это одна из ключевых особенностей Java, появившаяся в версии Java 8. Они представляют собой краткий способ написания анонимных функций (функций без имени), которые могут быть переданы в качестве аргументов методам или использованы для создания экземпляров функциональных интерфейсов. Лямбда-выражения значительно упрощают код, делают его более читаемым и позволяют использовать функциональное программирование в Java.
Лямбда-выражение состоит из следующих частей:
->
): Разделяет список параметров и тело лямбды.return
можно опустить.Пример лямбда-выражения:
(параметры) -> { тело }
Лямбда-выражения тесно связаны с функциональными интерфейсами. Функциональный интерфейс — это интерфейс, который содержит ровно один абстрактный метод. Примеры таких интерфейсов: Runnable
, Comparator
, Consumer
, Supplier
, Function
, Predicate
.
Пример функционального интерфейса:
@FunctionalInterface
public interface MyFunctionalInterface {
void doSomething();
}
Лямбда-выражение может быть использовано для реализации этого интерфейса:
MyFunctionalInterface lambda = () -> System.out.println("Doing something...");
lambda.doSomething();
Без лямбда-выражений:
List<String> names = Arrays.asList("John", "Anna", "Mike", "Elena");
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return a.compareTo(b);
}
});
С лямбда-выражением:
List<String> names = Arrays.asList("John", "Anna", "Mike", "Elena");
Collections.sort(names, (a, b) -> a.compareTo(b));
Без лямбда-выражений:
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Running in a thread");
}
});
thread.start();
С лямбда-выражением:
Thread thread = new Thread(() -> System.out.println("Running in a thread"));
thread.start();
List<String> names = Arrays.asList("John", "Anna", "Mike", "Elena");
List<String> filteredNames = names.stream()
.filter(name -> name.startsWith("A"))
.collect(Collectors.toList());
System.out.println(filteredNames); // [Anna]
List<String> names = Arrays.asList("John", "Anna", "Mike", "Elena");
List<Integer> nameLengths = names.stream()
.map(name -> name.length())
.collect(Collectors.toList());
System.out.println(nameLengths); // [4, 4, 4, 5]
Stream API: Лямбда-выражения активно используются в Stream API для работы с коллекциями, например, для фильтрации, сортировки, преобразования и агрегации данных.
Многопоточность: Лямбда-выражения упрощают создание и запуск потоков (threads), например, с использованием Runnable
.
Обработка событий: В GUI-приложениях лямбда-выражения могут использоваться для обработки событий, таких как нажатие кнопки.
Функциональные интерфейсы: Лямбда-выражения применяются для реализации функциональных интерфейсов, таких как Comparator
, Consumer
, Supplier
, Function
, Predicate
.
Параллельные вычисления: Лямбда-выражения используются в параллельных стримах для выполнения операций над данными в нескольких потоках.