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

 Зачем нужны функциональные интерфейсы и какое их предназначение? В гугле все говорят, что нужны для лямбда выражений но функциональные интерфейсы появились до выхода java 8 

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

  

Java задумывалась как исключительно объектно ориентированный язык, поэтому функций в ней никогда не было и нет. Всё *поведение* располагается в методах. Но для обработчиков событий, например, нужно только поведение, но не состояние, поэтому объект "оборачивающий" метод бесполезен. Обычно обработчик выглядел так:  

```
someButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        someTextField.setText("Кнопка нажата");
    }
});
```
  

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

  

В Java 8 просто появились способы более удобно работать с функциональными интерфейсами - в языке появились лямбды, у виртуальной машины появились средства, позволяющие генерировать из лямбд классы с функциональным интерфейсом, а в стандартной библиотеке появился пакет java.util.function, содержащий набор универсальных функциональных интерфейсов, позволяющих передавать и возвращать лямбды между методами в коде разных разработчиков. 

> но функциональные интерфейсы появились до выхода java 8

  

[Since: 1.8](https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html) 

 Для лямбд - это правильный ответ.   

Создатели джавы не осилили(постеснялись/посчитали ненужным/etc) сделать отдельный кусок синтаксиса для нормального описания функциональных типов, вместо этого сделали так, что интерфейс можно смаппить в лямбду, если у него(интерфейса) ровно один абстрактный метод. Собственно, все эти BiFunction, Predicate, ToLongBiFunction и прочие вырвиглазности - это костыли, чтобы ты мог лямбды передавать куда-то. Их, конечно, не хватит, и придется объявлять свои костыли с подходящей сигнатурой.  

Всё это обвесили аннотацией @FunctionalInterface, чтобы компилятор мог ругаться, что ты делаешь ошибки при объявлении функционального интерфейса. Правда, здорово?(нет).