@sys_user

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

Зачем нужны функциональные интерфейсы и какое их предназначение? В гугле все говорят, что нужны для лямбда выражений но функциональные интерфейсы появились до выхода java 8
  • Вопрос задан
  • 184 просмотра
Решения вопроса 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, содержащий набор универсальных функциональных интерфейсов, позволяющих передавать и возвращать лямбды между методами в коде разных разработчиков.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Bavashi
@Bavashi
но функциональные интерфейсы появились до выхода java 8

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

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

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