【问题标题】:callback vs lambda in JavaJava中的回调与lambda
【发布时间】:2018-09-14 07:59:17
【问题描述】:

Spring bean 生命周期documentation 经常提到callback methods

在尝试查找回调的含义时,我通过几个链接找到了提到它是将一个函数作为参数传递给另一个函数,这可以通过 Java 中的接口来实现。

我很困惑,如果这是回调,那么什么是 lambda 表达式和函数式接口?它们是相同的还是不同的?

【问题讨论】:

  • 回调是一种模式,您可以在某处传递一个函数,然后再调用它。函数式接口是一种指定您期望的函数类型的方法。 lambda 是实现函数式接口的一种快速方法。如果您想使用回调,Lambda 非常有用。
  • @dbl 我确实浏览了大部分答案,不仅是这个问题,还有其他问题。他们要么提到 c++ 和 JavaScript 的回调,要么在 Java 的情况下,没有提到与 lambda 的任何区别或相似之处
  • @SameerSinha 不要误会我的意思,我的意思是让您以正确的方式提出您的问题。因为我们已经有了答案,所以我的请求可能毫无意义......我的反对票被锁定,直到你编辑当然。
  • @dbl 编辑问题没有做任何事情。我如何看到对问题的反对票(如果可能,将其删除)。我是 SO 的初学者。
  • @SameerSinha 我已经删除了我的反对票。

标签: java lambda callback


【解决方案1】:

回调是一种模式,您可以在某处传递一个函数,然后再调用它。

函数式接口是一种指定您期望的函数类型的方式。

lambda 是一种实现函数式接口的快速方法。如果您想使用回调,Lambda 将非常有用。


例如:

假设我将在未来的某个时间生成一条消息,并且希望在它发生时被告知。我有一个方法可以让你给我一个函数,让我在消息准备好时调用。

public void callThisWithMessage(Consumer<String> messageConsumer);

你给我一个消息消费者,等消息准备好后我会调用它。这是回调的示例。

这里可以给我的函数类型由Consumer接口指定,这是一个函数接口。这个特殊的功能接口表示它有一个接受参数(在本例中为字符串)的方法。

如果你想使用我的回调服务,你可以使用 lambda 函数来实现消费者。

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

这会创建一个 lambda 函数来实现函数式接口Consumer&lt;String&gt;,并将其传递给我的方法以供后续回调

【讨论】:

  • 这个答案非常好,但我认为@Eran 的答案要好一些,因为在我看来回调不仅仅是“传递函数的模式......”,我们可能会传递一个实例具有多个抽象方法的接口,然后回调可以在其实现中使用所有或部分这些方法。
【解决方案2】:

Lambda 表达式是实现函数式接口的几种方法之一。

函数式接口用作回调,但并非所有回调都是函数式接口。用作回调的接口可以有多个抽象方法,而函数式接口只能有一个抽象方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-03
    • 2019-07-17
    • 2012-09-21
    • 2016-11-27
    • 2015-01-08
    • 1970-01-01
    相关资源
    最近更新 更多