Короткий ответ
Лямбда-выражение — это анонимная функция: блок кода без имени, который можно передавать как значение, например в аргументы метода. В Java 8 оно записывается как список параметров, стрелка и тело. Лямбда реализует единственный абстрактный метод функционального интерфейса, а типы параметров и возвращаемого значения компилятор выводит автоматически (type inference) из контекста.
Как это работает подробнее
Функциональный интерфейс (SAM-интерфейс) — это интерфейс ровно с одним абстрактным методом; в нём могут быть также статические и default-методы. Аннотация @FunctionalInterface необязательна, но позволяет компилятору проверить, что интерфейс действительно функциональный.
До Java 8 такое поведение реализовывали анонимными внутренними классами; лямбда — более компактная альтернатива им. Встроенные примеры — Runnable, Comparator, Callable, а в Java 8 добавлены Function, Consumer, Supplier, Predicate и другие интерфейсы пакета java.util.function.
- Лямбда не создаёт новый уровень вложенности, как анонимный класс: this внутри неё ссылается на окружающий объект.
- Захватываемые лямбдой локальные переменные должны быть effectively final.
- Лямбды активно применяются в Stream API и методах коллекций вроде forEach и removeIf.
Пример кода
public class LambdaExample {
@FunctionalInterface
interface Calculator {
int calc(int a, int b);
}
public static void main(String[] args) {
// анонимный класс (Java 5+)
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("Привет");
}
};
// то же самое лямбдой (Java 8+)
Runnable r2 = () -> System.out.println("Привет");
// функциональный интерфейс + лямбда
Calculator add = (a, b) -> a + b;
System.out.println(add.calc(2, 3)); // 5
}
}