Функциональные интерфейсы нужны, например, чтобы было куда сохранять лямбды.
У нас ведь нет специального типа переменных для лямбд. Поэтому любой интерфейс с одним методом можно использовать для хранения лямбд.
Пример, вот наша лямбда
() -> "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; class S implements Supplier<String> {
@Override
public String get() {
return "hello";
}
}
i = new S(); i = new Supplier<String>() {
@Override
public String get() {
return "hello";
}
};i = () -> "hello";Наверное, это самый наглядный пример того, зачем нужны лямбды и функциональные интерфейсы, хотя бы, с точки зрения краткости кода.