Ответ
Да, считается.
Функциональный интерфейс (Functional Interface) в Java определяется единственным абстрактным методом (Single Abstract Method — SAM). Наличие любого количества default-методов (с реализацией) или static-методов не нарушает это условие.
Почему это важно? Такие интерфейсы могут быть целевым типом для лямбда-выражений и ссылок на методы.
Пример:
// Аннотация @FunctionalInterface — проверка компилятором
@FunctionalInterface
interface DataProcessor {
// Единственный абстрактный метод (SAM)
String process(String input);
// default-метод НЕ нарушает условие функционального интерфейса
default void logProcessing() {
System.out.println("Processing started...");
}
// static-метод тоже допустим
static String getVersion() {
return "1.0";
}
}
// Использование с лямбдой (возможно, потому что интерфейс функциональный)
DataProcessor processor = (str) -> str.toUpperCase();
String result = processor.process("hello"); // "HELLO"
processor.logProcessing(); // Вызов default-метода
Ключевое правило: Абстрактных методов должен быть ровно один. Методы, унаследованные от Object (например, toString, equals), не учитываются при этом подсчёте.