Жизненный цикл компонента Spring. документация часто упоминают callback methods.

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

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

2
Sameer Sinha 14 Сен 2018 в 10:59

2 ответа

Лучший ответ

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

Функциональные интерфейсы - это способ указать, какую функцию вы ожидаете.

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


Например:

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

public void callThisWithMessage(Consumer<String> messageConsumer);

Вы даете мне потребителя сообщения, и я позвоню ему позже, когда сообщение будет готово. Это пример обратного вызова .

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

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

callThisWithMessage(msg -> System.out.println("Message received: "+msg));

Это создает лямбда-функцию, которая реализует функциональный интерфейс Consumer<String>, и передает ее моему методу для последующего обратного вызова .

5
khelwood 17 Сен 2019 в 09:09

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

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

3
Eran 14 Сен 2018 в 08:02