Считается ли интерфейс с default-методами функциональным, если у него только один абстрактный метод?

«Считается ли интерфейс с default-методами функциональным, если у него только один абстрактный метод?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, считается.

Функциональный интерфейс (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), не учитываются при этом подсчёте.