Kotlin中OnclickListener方法的区别

Ult*_*vil 12 android kotlin

我正在学习Kotlin.在此之前,我曾使用Java进行Android开发.Kotlin是一门很好的学习语言.我在使用时感到困惑setOnClickListener(View.OnClickListener).我在Android Studio上看到了两个提示.

图片

我知道如何工作或定义它们.

第一种实施方式 OnClickListerner

 send_button.setOnClickListener(object : View.OnClickListener{
       override fun onClick(p0: View?) {
           TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
       }
   })
Run Code Online (Sandbox Code Playgroud)

这是第二种实施方式 OnClickListener

 send_button.setOnClickListener {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }
Run Code Online (Sandbox Code Playgroud)

我理解第二种方法基于lambda.但我无法正确理解这些方法.

所以,我的问题是:这些方法有什么区别?如果它们不同,哪一个更好,为什么?

Int*_*iya 5

您的问题: 这些方法有什么区别?如果它们不同,哪一个更好,为什么?

编译后,两者都会生成相同的字节码,但在编写它时,通过单行实现可以为您提供更多的可读性。

Java 8 的一大特色是 Lambda 表达式。使用 Lambda,您可以更简单地编写 Java 代码。此功能稍微改变了代码的丑陋外观。

示例:来源

您可以将单一抽象方法 (SAM)编写为 lambda。

如果您的接口只有一种方法。

public interface StateChangeListener {

    public void onStateChange(State oldState, State newState);

}
Run Code Online (Sandbox Code Playgroud)

您可以将其写为 Lambda,如下所示。

stateOwner.addStateListener(
    (oldState, newState) -> System.out.println("State changed")
);
Run Code Online (Sandbox Code Playgroud)

但这两种方法是相同的,但你可以看到第二种方法非常简单,并且删除了丑陋的实现。

在 Kotlin 中,lambda 表达式与 Java 不同。

Kotlin lambda表达式示例:源代码

val add: (Int, Int) -> Int = { a, b ->  a + b }
Run Code Online (Sandbox Code Playgroud)

上面的函数变量可以这样调用:

val addedValue: Int = add(5, 5)
Run Code Online (Sandbox Code Playgroud)

这将返回两个整数的相加值。

在这个例子中你可以看到(Int, Int) -> Int,这在 Kotlin 中被称为 lambda 函数。

所以Kotlin lambda 和Java lambda 函数是完全不同的。

你可以在 Kotlin 文档中看到:

就像 Java 8 一样,Kotlin 支持 SAM 转换。这意味着只要接口方法的参数类型与 Kotlin 函数的参数类型匹配,Kotlin 函数字面量就可以自动转换为具有单个非默认方法的 Java 接口的实现。

实际上,您正在用kotlin编写lambda,稍后它将转换为java接口。所以这两种方法是不同的。但在执行方面,两者是相同的。它不会影响编译时间,因此始终建议使用 lambda。

希望能帮助到你 :)


Bak*_*aii 5

它们指的是相同的功能,但是以不同的方式编写.第一种是调用setOnClickListener()接受OnClickListener对象的函数的典型方法.

第二个使用lambda表达式.它的工作原理是因为View.OnClickListener是Java中定义的SAM类型,Kotlin支持SAM转换.

就像Java 8一样,Kotlin支持SAM转换.这意味着只要接口方法的参数类型与Kotlin函数的参数类型匹配,Kotlin函数文字就可以使用单个非默认方法自动转换为Java接口的实现.

假设你有一个用Java定义的接口,如下所示:

public class Example {
    public interface SingleMethodInterface {
        int length(String text);
    }

    public static void set(SingleMethodInterface sam) {}
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以set()在Kotlin中通过以下两种方式调用函数:

//Passing a function type which accept a `String` and return an `Int`
val length: (String) -> Int = { it.length }
Example.set(length)
//or
Example.set { it.length }

//Passing an object which implements `SingleMethodInterface`
val length2: Main.SingleMethodInterface = object: Main.SingleMethodInterface {
    override fun length(text: String): Int {
        return text.length
    }
}
Example.set(length2)
Run Code Online (Sandbox Code Playgroud)

简而言之,SAM转换提供了一种在Kotlin中编写干净代码的方法,该代码与Java互操作.