Java 8 Lambda Expressions: руководство по функциональному программированию
Лямбда-выражения — главная фича Java 8. Упрощают разработку, позволяя передавать поведение как данные.
Синтаксис
parameter -> expression body
Характеристики
- Optional type declaration — тип параметра выводится компилятором.
- Optional parenthesis — для одного параметра скобки не нужны; для нескольких — обязательны.
- Optional curly braces — для однострочного тела не нужны.
- Optional return — неявный возврат для однострочных выражений; фигурные скобки требуют явного
return.
Примеры лямбд
// с типами
MathOperation addition = (int a, int b) -> a + b;
// без типов
MathOperation subtraction = (a, b) -> a - b;
// с return и фигурными скобками
MathOperation multiplication = (int a, int b) -> { return a * b; };
// без return и скобок
MathOperation division = (int a, int b) -> a / b;
// без скобок у параметра
GreetingService greet1 = message -> System.out.println("Hello " + message);
// со скобками
GreetingService greet2 = (message) -> System.out.println("Hello " + message);
Полный пример
public class Java8Tester {
public static void main(String[] args) {
Java8Tester tester = new Java8Tester();
MathOperation addition = (int a, int b) -> a + b;
MathOperation subtraction = (a, b) -> a - b;
MathOperation multiplication = (int a, int b) -> { return a * b; };
MathOperation division = (int a, int b) -> a / b;
System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
System.out.println("10 / 5 = " + tester.operate(10, 5, division));
GreetingService greet1 = message -> System.out.println("Hello " + message);
GreetingService greet2 = (message) -> System.out.println("Hello " + message);
greet1.sayMessage("Mahesh");
greet2.sayMessage("Suresh");
}
interface MathOperation { int operation(int a, int b); }
interface GreetingService { void sayMessage(String message); }
private int operate(int a, int b, MathOperation op) {
return op.operation(a, b);
}
}
Вывод
10 + 5 = 15
10 - 5 = 5
10 x 5 = 50
10 / 5 = 2
Hello Mahesh
Hello Suresh
Область видимости (Scope)
Лямбда может захватывать final или effectively final переменные (присваиваются один раз). Повторное присваивание — ошибка компиляции.
Пример
public class Java8Tester {
final static String salutation = "Hello! ";
public static void main(String[] args) {
GreetingService gs = message -> System.out.println(salutation + message);
gs.sayMessage("Mahesh");
}
interface GreetingService { void sayMessage(String message); }
}
Вывод
Hello! Mahesh
java
- Освоение операторов Java: типы, синтаксис и практические примеры
- Понимание выражений, операторов и блоков в Java
- Комментарии в Java: типы, использование и лучшие практики
- Освоение улучшенного цикла for в Java: синтаксис, примеры и лучшие практики
- Освоение строк в Java: создание, методы и лучшие практики
- Интерфейсы в Java: концепции, реализация и лучшие практики
- Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
- Try-with-resources в Java: автоматическое управление ресурсами
- Аннотации в Java: типы, размещение и практические примеры
- Assertions в Java: практическое руководство по обнаружению багов и обеспечению надежности кода