Какие требования предъявляются к функциональному интерфейсу в Java
Что проверяют
Понимаете ли вы, что делает интерфейс функциональным и почему это позволяет писать лямбды.
Как отвечать
Функциональный интерфейс это интерфейс ровно с одним абстрактным методом. Только такой можно реализовать лямбдой или ссылкой на метод: компилятор знает, какой именно метод вы описываете.
Что не считается за абстрактный метод и не мешает:
- методы
defaultиstatic, их может быть сколько угодно; - методы, повторяющие публичные методы
Object(equals,hashCode,toString): они и так есть у любой реализации.
@FunctionalInterface
interface Validator<T> {
boolean test(T value); // единственный абстрактный
default Validator<T> negate() { return v -> !test(v); }
}Аннотация @FunctionalInterface не обязательна, лямбда сработает и без неё. Её смысл в другом: она заставляет компилятор проверить условие и не даст случайно добавить второй абстрактный метод, сломав всех, кто уже пишет лямбды.
Готовые из java.util.function: Function, Supplier, Consumer, Predicate, BiFunction, UnaryOperator. Прежде чем заводить свой интерфейс, стоит поискать подходящий там.
Где спотыкаются
Считают @FunctionalInterface обязательной.
Не знают, что default и static методы разрешены, и объявляют лишние интерфейсы.
Забывают про исключение для методов Object, из-за чего не понимают, почему Comparator с двумя методами функциональный.
Пишут свой интерфейс там, где хватило бы Predicate или Function.