Аннотация FunctionalInterface
Аннотация FunctionalInterface помечает интерфейс как
функциональный. Функциональный интерфейс - это интерфейс,
который содержит ровно один абстрактный метод. Такие
интерфейсы можно реализовывать с помощью лямбда-выражений
и ссылок на методы. Аннотация необязательна, но она
позволяет компилятору проверить, что интерфейс действительно
содержит только один абстрактный метод, и выдать ошибку
в противном случае. Параметров у аннотации нет.
Синтаксис
@FunctionalInterface
public interface InterfaceName
{
returnType methodName(parameters);
}
Пример
Объявим функциональный интерфейс с одним абстрактным методом и реализуем его через лямбда-выражение:
@FunctionalInterface
interface Operation
{
int apply(int a, int b);
}
public class Main
{
public static void main(String[] args)
{
Operation sum = (a, b) -> a + b;
Operation mult = (a, b) -> a * b;
System.out.println(sum.apply(2, 3));
System.out.println(mult.apply(2, 3));
}
}
Результат выполнения кода:
5
6
Пример
Если в интерфейсе объявить два абстрактных метода, компилятор выдаст ошибку. Давайте убедимся в этом:
@FunctionalInterface
interface Operation
{
int apply(int a, int b);
int apply2(int a, int b);
}
Результат компиляции:
error: Unexpected @FunctionalInterface annotation
Operation is not a functional interface
multiple non-overriding abstract methods found in interface Operation
Также функциональный интерфейс может содержать методы
default и static - они не считаются абстрактными
и не мешают аннотации. Давайте проверим:
@FunctionalInterface
interface Operation
{
int apply(int a, int b);
default int applyZero(int a)
{
return apply(a, 0);
}
static int applyOne(int a)
{
return a;
}
}
public class Main
{
public static void main(String[] args)
{
Operation sum = (a, b) -> a + b;
System.out.println(sum.apply(2, 3));
System.out.println(sum.applyZero(2));
System.out.println(Operation.applyOne(2));
}
}
Результат выполнения кода:
5
2
2
Смотрите также
-
аннотация
Annotation,
которая является базовой для всех аннотаций -
аннотация
Target,
которая задает область применения аннотации -
аннотация
Retention,
которая определяет время жизни аннотации -
аннотация
Override,
которая проверяет переопределение метода