首页 > 解决方案 > lambda 函数如何替换 Kotlin 中的对象实例?

问题描述

例如,在 Java 中,您将添加一个侦听器而不使用 lambda,如下所示

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

            }
        });

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

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

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

标签: kotlinlambda

解决方案


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

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


推荐阅读