Lambda Function
Что это
Лямбда выражения(анонимные методы) - возможность быстро без помощи анонимных классов реализовать интерфейс
с одним методом(также может содержать default и static методы). Есть преимущество перед анонимными классами,
так как после компиляции лямбда становиться методом класса. Также есть преимущества у многоядерных процессоров
путем параллельной обработки коллекций. Лямбда позволяет хранить и передавать код как переменную.
- Lambda-выражения могут иметь от 0 и более входных параметров.
- Тип параметров можно указывать явно либо может быть получен из контекста. Например (int a) можно
записать и так (a).
- Параметры заключаются в круглые скобки и разделяются запятыми. Например (a, b) или (int a, int b) или
(String a, int b, float c).
- Если параметров нет, то нужно использовать пустые круглые скобки. Например () -> 42.
- Когда параметр один, если тип не указывается явно, скобки можно опустить. Пример: a -> return a*a.
- Тело Lambda-выражения может содержать от 0 и более выражений.
- Если тело состоит из одного оператора, его можно не заключать в фигурные скобки, а возвращаемое значение
можно указывать без ключевого слова return.
- В противном случае фигурные скобки обязательны (блок кода), а в конце надо указывать возвращаемое
значение с использованием ключевого слова return (в противном случае типом возвращаемого значения будет
void).
@FunctionalInterface
@FunctionalInterface - аннотация метка которая при компиляции следит, чтобы интерфейс соответствовал
условиям functional interface - только 1 абстрактный метод. Позволяет другие default и static методы.
Разница между Lambdas и Anonymous Classes
Лямбда-выражения имеют лаконичный синтаксис по сравнению с анонимными классами.
Лямбды проще читать и писать, так как они не требуют явного объявления метода, тогда как анонимные классы
содержат больше «лишнего» кода.
Лямбды используются, когда интерфейс имеет один абстрактный метод (функциональные интерфейсы), тогда как
анонимные классы могут реализовать несколько методов и применяться для интерфейсов с несколькими методами.
Лямбды могут быть более эффективными, так как они компилируются в байт-код, который может быть оптимизирован.
Анонимные классы обычно компилируются как отдельные классы, что может требовать больше ресурсов.
parameter -> {expression}
или
(parameter1, parameter2) -> {expression}
Пример реализации Runnable
Runnable task = () -> {
String threadName = Thread.currentThread().getName();
System.out.println("Hello " + threadName);
};
Thread thread = new Thread(task);
thread.start();
Важные @FunctionalInterface в Java
- Predicate<T> - "boolean test(T t)" - фильтрация.
- Consumer<T> - "void accept(T t);" - выполняет некоторое действие над объектом типа T, при этом
ничего не возвращая.
- Supplier<T> - "T get()" - не принимает никаких аргументов, но должен возвращать объект типа T.
- Function<T, R> - "R apply(T t);" - представляет функцию перехода от объекта типа T к объекту типа R.
- UnaryOperator<T> - "T apply(T t)" - принимает в качестве параметра объект типа T, выполняет над ними
операции и возвращает результат операций в виде объекта типа T.
- BinaryOperator<T> - "T apply(T t1, T t2)" - принимает в качестве параметра два объекта типа T,
выполняет над ними бинарную операцию и возвращает ее результат также в виде объекта типа T.