Функциональные интерфейсы
Привет! Поговорим про функциональные интерфейсы.
Функциональные интерфейсы являются одним из ключевых элементов функционального программирования в Java, особенно с появлением лямбда-выражений в Java 8. Функциональный интерфейс — это интерфейс, содержащий ровно один абстрактный метод, который можно реализовать с использованием лямбда-выражений, ссылок на методы или анонимных классов.
Функциональные интерфейсы в Java обозначаются аннотацией @FunctionalInterface, которая указывает на то, что интерфейс предназначен для использования в функциональном стиле. Однако эта аннотация не обязательна, но она помогает разработчикам - компилятор начнет ругаться, если интерфейс перестанет быть функциональным.
Вот пример:
@FunctionalInterface
public interface MyFunctionalInterface {
void execute( );
}
Этот интерфейс содержит единственный абстрактный метод execute(), что делает его функциональным интерфейсом.
Вот пример с лямбда-выражениями с нашим интерфейсом:
MyFunctionalInterface myFunction = () ->
System.out.println("Hello, Lambda!");
myFunction.execute();
В этом примере лямбда-выражение (то что начинается с () -> ) реализует метод execute() нашего функционального интерфейса.
Функциональные интерфейсы могут иметь любое кол-во статических и дефолтных методов и они все равно останутся функциональными:
@FunctionalInterface
interface MyFunctionalInterface {
void execute();
static boolean check(T t) {
return t == null;
}
default String name() {
return "Barsik";
}
}
В данном примере все хорошо скомпилируется. И если заметили звездочку в начале поста, то вот уточнение к ней - ровно один абстрактный метод, НЕ совпадающий сигнатурой с каким-либо методом класса Object: @FunctionalInterface interface MyFunctionalInterface { void execute(); boolean equals(Object obj); } Такой интерфейс так же будет функциональным! Но если мы уберем метод execute() и оставим equals(), то компилятор скажет нам - no abstract method found.