Lambda'的目的是什么;接电话的人是谁?
当我们有扩展功能时,Kotlin中带有接收器的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
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的扩展..}