Go to the home page  / Java  / Функциональное программирование  / Функциональные интерфейсы

Функциональные интерфейсы

Igor Lazarevsky, 2022.02.03 21:50

Функциональные интерфейсы нужны, например, чтобы было куда сохранять лямбды.

У нас ведь нет специального типа переменных для лямбд. Поэтому любой интерфейс с одним методом можно использовать для хранения лямбд.

Пример, вот наша лямбда

() -> "hello";

И сохраним ее в переменной

Supplier s = () -> "hello";

Или даже в массиве

Supplier[] suppliers = {() -> "Hello", () -> "Bye"};

Что такое Supplier?

Это готовый интерфейс в Java в пакете java.util.function

@FunctionalInterface
public interface Supplier<T> {

    /**
     * Gets a result.
     *
     * @return a result
     */
    T get();
}

Но мы видим, что он типизирован, поэтому правильно тип указывать

Supplier<String> s = () -> "hello";

Определение

Интерфейс, с ровно одним абстрактным методом, называется функциональным интерфейсом.

  • Может иметь любое количество статических методов и методов по умолчанию.
  • Но может содержать только один абстрактный метод.

Функциональный интерфейс еще называется Интерфейс с одним абстрактным методом или интерфейс SAM (Single Abstract Method).

Подведем итоги

Пусть у нас будет переменная типа функционального интерфейса

Supplier<String> i;

1. Мы можем в нее сохранить просто экземпляр класса, который реализует этот интерфейс

    class S implements Supplier<String> {
        @Override
        public String get() {
            return "hello";
        }
    }

    i = new S();

2. Мы можем в нее сохранить экземпляр анонимного внутреннего класса

    i = new Supplier<String>() {
        @Override
        public String get() {
            return "hello";
        }
    };

3. И можем просто сохранить в нее лямбду, самая короткая запись

i = () -> "hello";

Наверное, это самый наглядный пример того, зачем нужны лямбды и функциональные интерфейсы, хотя бы, с точки зрения краткости кода.

Igor Lazarevsky, 2022.02.03 21:53