Может ли интерфейс без аннотации @FunctionalInterface использоваться как функциональный?

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

Ответ

Да, может.

Аннотация @FunctionalInterface является необязательной, но рекомендуемой. Её основное назначение — явно обозначить намерение разработчика и дать гарантии компилятору.

Ключевые моменты:

  1. Условие для функционального интерфейса: он должен содержать ровно один абстрактный метод (Single Abstract Method — SAM).
  2. Роль @FunctionalInterface:
    • Документация. Чётко показывает, что интерфейс предназначен для лямбда-выражений.
    • Защита от ошибок. Компилятор выдаст ошибку, если в интерфейсе с этой аннотацией не будет одного абстрактного метода или если его добавить позже по ошибке.

Пример:

// Без аннотации — всё равно функциональный интерфейс
interface StringProcessor {
    String process(String input); // один абстрактный метод (SAM)
}

// С аннотацией — рекомендуется
@FunctionalInterface
interface Validator {
    boolean isValid(String value);
    // Компилятор проверит, что здесь только один абстрактный метод
}

// Использование (одинаково для обоих случаев):
StringProcessor upperCaseProcessor = s -> s.toUpperCase();
Validator notEmptyValidator = v -> v != null && !v.isEmpty();

Вывод: Интерфейс становится функциональным благодаря своей структуре (один абстрактный метод), а не благодаря аннотации. Аннотация — это инструмент для контроля и ясности кода.