Lambda Function

Что это

Лямбда выражения(анонимные методы) - возможность быстро без помощи анонимных классов реализовать интерфейс с одним методом(также может содержать default и static методы). Есть преимущество перед анонимными классами, так как после компиляции лямбда становиться методом класса. Также есть преимущества у многоядерных процессоров путем параллельной обработки коллекций. Лямбда позволяет хранить и передавать код как переменную.

@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

  1. Predicate<T> - "boolean test(T t)" - фильтрация.
  2. Consumer<T> - "void accept(T t);" - выполняет некоторое действие над объектом типа T, при этом ничего не возвращая.
  3. Supplier<T> - "T get()" - не принимает никаких аргументов, но должен возвращать объект типа T.
  4. Function<T, R> - "R apply(T t);" - представляет функцию перехода от объекта типа T к объекту типа R.
  5. UnaryOperator<T> - "T apply(T t)" - принимает в качестве параметра объект типа T, выполняет над ними операции и возвращает результат операций в виде объекта типа T.
  6. BinaryOperator<T> - "T apply(T t1, T t2)" - принимает в качестве параметра два объекта типа T, выполняет над ними бинарную операцию и возвращает ее результат также в виде объекта типа T.