@sys_user

Зачем нужны функциональные интерфейсы в java?

Зачем нужны функциональные интерфейсы и какое их предназначение? В гугле все говорят, что нужны для лямбда выражений но функциональные интерфейсы появились до выхода java 8
  • Вопрос задан
  • 2293 просмотра
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Java
Седой и строгий
Функциональный интерфейс - это не что-то техническое, что реализуется в языке или виртуальной машине. Это просто абстракция, которая была в Java всегда.

Java задумывалась как исключительно объектно ориентированный язык, поэтому функций в ней никогда не было и нет. Всё поведение располагается в методах. Но для обработчиков событий, например, нужно только поведение, но не состояние, поэтому объект "оборачивающий" метод бесполезен. Обычно обработчик выглядел так:
someButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        someTextField.setText("Кнопка нажата");
    }
});

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

В Java 8 просто появились способы более удобно работать с функциональными интерфейсами - в языке появились лямбды, у виртуальной машины появились средства, позволяющие генерировать из лямбд классы с функциональным интерфейсом, а в стандартной библиотеке появился пакет java.util.function, содержащий набор универсальных функциональных интерфейсов, позволяющих передавать и возвращать лямбды между методами в коде разных разработчиков.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Для лямбд - это правильный ответ.
Создатели джавы не осилили(постеснялись/посчитали ненужным/etc) сделать отдельный кусок синтаксиса для нормального описания функциональных типов, вместо этого сделали так, что интерфейс можно смаппить в лямбду, если у него(интерфейса) ровно один абстрактный метод. Собственно, все эти BiFunction, Predicate, ToLongBiFunction и прочие вырвиглазности - это костыли, чтобы ты мог лямбды передавать куда-то. Их, конечно, не хватит, и придется объявлять свои костыли с подходящей сигнатурой.
Всё это обвесили аннотацией @FunctionalInterface, чтобы компилятор мог ругаться, что ты делаешь ошибки при объявлении функционального интерфейса. Правда, здорово?(нет).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы