【问题标题】:How does lambda function replace an object instance in Kotlin?lambda 函数如何替换 Kotlin 中的对象实例?
【发布时间】:2021-08-08 04:19:43
【问题描述】:

例如,在 Java 中,您可以在不使用 lambda 的情况下添加监听器,如下所示

view.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {

            }
        });

但这在 Kotlin 中可以像这样替换

view.setOnCheckedChangeListener({ compoundButton, b -> true})

如何处理新实例创建部分? lambda 是否处理对象实例的创建?

【问题讨论】:

    标签: kotlin lambda


    【解决方案1】:

    没有 lambda 实例,至少没有你真正关心的实例。 Kotlin 将函数(在本例中为 lambda)提升为“一等公民”,因此现在您可以将实际函数本身作为参数传递,而不仅仅是可以调用函数的对象。

    这方面的一个例子是,在您的 Java 示例中,您可以在 onCheckedChanged 中引用变量 this。您不能在 lambda 中执行此操作,因为没有有意义的 this 可供参考。

    如果您有兴趣,可以阅读有关 lambdas 实际编译到引擎盖下的内容(例如here),但最终您不需要关心。这只是一个函数。

    【讨论】:

      【解决方案2】:

      您所指的侦听器是称为SAM interfaces 或“单一抽象方法”接口的特殊类型的接口。任何只有一个抽象方法的接口都有资格成为 SAM 接口。在 Kotlin 中,您必须使用 fun interface 显式标记此类接口才能声明它,但在 Java 中我们没有这样的机制,因此所有符合条件的 Java 接口在 Kotlin 中都被视为 SAM。

      任何 SAM 接口都可以传递 lambda 而不是对象。运行时将理解此 lambda 旨在被解释为适当接口的实例,并将自动将其包装在必要的代码中。这是(我相信;如果我感到困惑,有人可能会纠正我)曾经在 Kotlin 方面完成过,但 Java has support for SAM interfaces 现在也是如此,并且在我看来,看起来 Kotlin 正在编译为 Java现在的SAM接口机制。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-30
        • 2022-07-03
        • 2019-02-14
        • 2012-07-07
        • 2014-03-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多