Обратный вызов против лямбды в Java

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

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

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

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

khelwood 14.09.2018 10:24

@dbl Я просмотрел большинство ответов не только на этот, но и на другие вопросы. Они либо упоминают обратный вызов для C++ и JavaScript, либо, в случае Java, не упоминают никаких различий или сходства с лямбда.

sss 14.09.2018 12:22

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

dbl 14.09.2018 15:27

@dbl Редактирование вопроса ничего не дало. Как увидеть, что по вопросам проголосовали против (и, если возможно, удалить его). Я новичок в ТАК.

sss 15.09.2018 17:30

@SameerSinha Я снял свой голос против.

dbl 15.09.2018 17:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
7
5
5 067
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Ответ принят как подходящий

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

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

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


Например:

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

public void callThisWithMessage(Consumer<String> messageConsumer);

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

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

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

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

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

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

aderchox 26.04.2021 15:01

Другие вопросы по теме