Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lambda'的目的是什么;接电话的人是谁?_Lambda_Kotlin_Jetbrains Ide - Fatal编程技术网

Lambda'的目的是什么;接电话的人是谁?

Lambda'的目的是什么;接电话的人是谁?,lambda,kotlin,jetbrains-ide,Lambda,Kotlin,Jetbrains Ide,当我们有扩展功能时,Kotlin中带有接收器的Lambda的用途是什么 以下两个函数的作用相同,但第一个函数更具可读性且更简短: fun main(args: Array<String>) { println("123".represents(123)) println(123.represents("123")) } fun String.represents(another: Int) = toIntOrNull() == another val repres

当我们有扩展功能时,Kotlin中带有接收器的Lambda的用途是什么

以下两个函数的作用相同,但第一个函数更具可读性且更简短:

fun main(args: Array<String>) {
    println("123".represents(123))
    println(123.represents("123"))
}

fun String.represents(another: Int) = toIntOrNull() == another

val represents: Int.(String) -> Boolean = {this == it.toIntOrNull()}
fun main(args:Array){
println(“123”。代表(123))
println(123.代表(“123”))
}
表示(另一个:Int)=toIntOrNull()==另一个
val表示:Int.(String)->Boolean={this==it.toIntOrNull()}

带有接收器的lambda基本上与扩展函数完全相同,它们只能存储在属性中,并传递给函数。这个问题本质上与“当我们有函数时,lambdas的目的是什么?”相同。答案也是一样的——它允许您在代码中的任何地方快速创建匿名扩展函数

这方面有很多很好的用例(请特别参阅),但这里我将给出一个简单的示例

例如,假设您有这样一个函数:

fun buildString(actions: StringBuilder.() -> Unit): String {
    val builder = StringBuilder()
    builder.actions()
    return builder.toString()
}
val str = buildString {
    append("Hello")
    append(" ")
    append("world")
}
调用此函数将如下所示:

fun buildString(actions: StringBuilder.() -> Unit): String {
    val builder = StringBuilder()
    builder.actions()
    return builder.toString()
}
val str = buildString {
    append("Hello")
    append(" ")
    append("world")
}
此语言功能启用了几个有趣的功能:

  • 在传递给
    buildString
    的lambda中,您处于一个新的作用域中,因此具有可供使用的新方法和属性。在这种特定情况下,您可以在
    StringBuilder
    类型上使用方法,而无需在任何实例上调用它们
  • 这些函数调用的实际
    StringBuilder
    实例不是由您管理的,而是由函数的内部实现创建一个实例并在其上调用扩展函数
  • 因此,此函数也可能不仅仅在一个
    StringBuilder
    上调用一次传递给它的lambda,它还可以在各种
    StringBuilder
    实例上多次调用它,并将其存储以供以后使用,等等
  • 相似性 从某种意义上说,扩展函数是具有接收器的函数。当您将lambdas与receiver一起使用时,您正在利用Kotlin的扩展功能特性

    lambda是一种定义行为的方法,类似于常规函数

    带有接收器的lambda是一种定义行为的方法,类似于扩展函数

    为了理解LAMBDAS与接收方的目的,请考虑下面的示例函数,该函数创建并返回<代码>按钮< /C> >

    fun createButton(): Button {
        val button = Button()
        button.text = "Some text"
        button.height = 40
        button.width = 60
        button.setOnClickListener(listener)
        button.background = drawable
        return button
    }
    
    如上所述,您可以在
    按钮
    对象上调用许多不同的方法,在每次调用中重复名称
    按钮
    。这只是一个小例子。如果表达的时间较长或重复多次,这将很不方便,看起来也不好看


    目的 为了使它更简洁、美观和可读性更好,我们使用lambda和receiver,并使用扩展函数
    apply()
    。并重构上述代码,如下所示:

    fun createButton() = Button().apply {
        text = "Some text"
        height = 40
        width = 60
        setOnClickListener(listener)
        background = drawable
    }
    
    现在代码看起来更好看了。
    按钮()
    是接收方对象,您可以调用方法并设置其属性

    这在创建实例并立即初始化某些属性时非常有用。在Java中,这是使用
    Builder
    模式完成的。在Kotlin中,您可以对任何对象使用
    apply()
    ,即使它不支持
    Builder
    模式

    apply()
    函数在Kotlin标准库中定义如下(简化):

    fun T.apply(块:T.()->单位):T{
    块()
    还这个
    }
    

    您可以用类似的方式定义自己的带有接收器的lambda。

    这里有一个更好的解释:java上是否有类似的功能,或者有人能给我提供一个参考?{我正在java项目中使用基于kotlin的扩展..}