Вопрос-ответ

What are functional interfaces used for in Java 8?

Для чего используются функциональные интерфейсы в Java 8?

Я наткнулся на новый термин в Java 8: "функциональный интерфейс". Я смог найти только одно его использование при работе с лямбда-выражениями.

Java 8 предоставляет несколько встроенных функциональных интерфейсов, и если мы хотим определить какой-либо функциональный интерфейс, мы можем использовать @FunctionalInterface аннотацию . Это позволит нам объявить только один метод в интерфейсе.

Например:

@FunctionalInterface
interface MathOperation {
int operation(int a, int b);
}

Насколько это полезно в Java 8, помимо простой работы с лямбда-выражениями?

(Вопрос здесь отличается от того, который я задавал. В нем спрашивается, зачем нам нужны функциональные интерфейсы при работе с лямбда-выражениями. Мой вопрос таков: каковы другие виды использования функциональных интерфейсов, помимо использования с лямбда-выражениями?)

Переведено автоматически
Ответ 1

@FunctionalInterface аннотации полезны для проверки времени компиляции вашего кода. У вас не может быть более одного метода, кроме static, default и абстрактных методов, которые переопределяют методы в Object вашем @FunctionalInterface или любом другом интерфейсе, используемом в качестве функционального интерфейса.

Но вы можете использовать лямбды без этой аннотации, а также вы можете переопределять методы без @Override аннотации.

Из документов


функциональный интерфейс имеет ровно один абстрактный метод. Поскольку методы по умолчанию имеют реализацию, они не являются абстрактными. Если интерфейс объявляет абстрактный метод, переопределяющий один из общедоступных методов java.lang.Объект, который также не учитывается при подсчете абстрактного метода интерфейса, поскольку любая реализация интерфейса будет иметь реализацию из java.lang.Объект или где-либо еще


Это можно использовать в лямбда-выражении:

public interface Foo {
public void doSomething();
}

Это не может быть использовано в лямбда-выражении:

public interface Foo {
public void doSomething();
public void doSomethingElse();
}

Но это приведет к ошибке компиляции:

@FunctionalInterface
public interface Foo {
public void doSomething();
public void doSomethingElse();
}

Недопустимая аннотация '@FunctionalInterface'; Foo не является функциональным
интерфейс


Ответ 2

В документации действительно есть разница между назначением


Информативный тип аннотации, используемый для указания того, что объявление типа интерфейса должно быть функциональным интерфейсом, как определено спецификацией языка Java.


и пример использования


Обратите внимание, что экземпляры функциональных интерфейсов могут быть созданы с помощью лямбда-выражений, ссылок на методы или ссылок на конструкторы.


формулировка которого не исключает других вариантов использования в целом. Поскольку основная цель - указать функциональный интерфейс, ваш фактический вопрос сводится к “Существуют ли другие варианты использования для функциональных интерфейсов , кроме лямбда-выражений и ссылок на методы / конструкторы?”

Поскольку функциональный интерфейс - это конструкция языка Java, определенная спецификацией языка Java, только эта спецификация может ответить на этот вопрос:

JLS §9.8. Функциональные интерфейсы:



В дополнение к обычному процессу создания экземпляра интерфейса путем объявления и создания экземпляра класса (§15.9), экземпляры функциональных интерфейсов могут быть созданы с помощью выражений ссылок на методы и лямбда-выражений (§15.13, §15.27).


Итак, в спецификации языка Java не сказано иного, единственный вариант использования, упомянутый в этом разделе, - это создание экземпляров интерфейса с выражениями ссылок на методы и лямбда-выражениями. (Сюда входят ссылки на конструкторы, поскольку они отмечены как одна из форм выражения ссылки на метод в спецификации).

Итак, одним предложением: нет, другого варианта использования для этого в Java 8 нет.

Ответ 3

Как говорили другие, функциональный интерфейс - это интерфейс, который предоставляет доступ к одному методу. У него может быть более одного метода, но все остальные должны иметь реализацию по умолчанию. Причина, по которой это называется "функциональным интерфейсом", заключается в том, что он эффективно действует как функция. Поскольку вы можете передавать интерфейсы как параметры, это означает, что функции теперь являются "гражданами первого класса", как в функциональных языках программирования. Это имеет много преимуществ, и вы увидите их довольно часто при использовании Stream API. Конечно, лямбда-выражения являются основным очевидным применением для них.

Ответ 4

Вовсе нет. Лямбда-выражения - это единственный пункт этой аннотации.

java lambda java-8