upt*_*you 15 lambda jetbrains-ide kotlin
Lambda与Kotlin的Receiver的目的是什么,而我们有扩展功能?
下面的两个函数做同样的事情,但是第一个函数更易读和简短:
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()}
Run Code Online (Sandbox Code Playgroud)
zsm*_*b13 29
带接收器的Lambda基本上与扩展函数完全相同,它们只能存储在属性中,并传递给函数.这个问题基本上与"当我们有功能时lambda的目的是什么?"相同.答案也大致相同 - 它允许您在代码中的任何位置快速创建匿名扩展功能.
有很多很好的用例(特别参见DSL),但我在这里给出一个简单的例子.
例如,假设您有这样的函数:
fun buildString(actions: StringBuilder.() -> Unit): String {
val builder = StringBuilder()
builder.actions()
return builder.toString()
}
Run Code Online (Sandbox Code Playgroud)
调用此函数将如下所示:
val str = buildString {
append("Hello")
append(" ")
append("world")
}
Run Code Online (Sandbox Code Playgroud)
启用此语言功能有几个有趣的事情:
buildString
,您处于一个新的范围内,因此可以使用新的方法和属性.在这种特定情况下,您可以使用该StringBuilder
类型的方法,而无需在任何实例上调用它们.StringBuilder
这些函数调用的实际实例不是由您管理的 - 由函数的内部实现来创建一个并在其上调用您的扩展函数.StringBuilder
- 它可以多次调用它,在各种StringBuilder
实例上,存储它供以后使用,等等.从某种意义上说,扩展函数是带有接收器的函数。当您将 lambda 表达式与接收器一起使用时,您正在利用 Kotlin 的扩展函数功能。
lambda是一种定义与常规函数类似的行为的方法。
带有接收器的 lambda是一种定义类似于扩展函数的行为的方法。
要了解 lambda 与接收器的用途,请考虑以下创建并返回Button
.
fun createButton(): Button {
val button = Button()
button.text = "Some text"
button.height = 40
button.width = 60
button.setOnClickListener(listener)
button.background = drawable
return button
}
Run Code Online (Sandbox Code Playgroud)
正如您在上面看到的,您在对象上调用了许多不同的方法button
,并在每次调用中重复名称button
。这只是一个小例子。如果表达式较长或重复多次,会很不方便,而且看起来也不美观。
为了使其更简洁、美观和更具可读性,我们使用带有扩展函数的接收器的 lambda apply()
。并将上面的代码重构如下:
fun createButton() = Button().apply {
text = "Some text"
height = 40
width = 60
setOnClickListener(listener)
background = drawable
}
Run Code Online (Sandbox Code Playgroud)
现在代码看起来更赏心悦目了。这Button()
是接收者对象,您可以调用其方法并设置其属性。
当您创建实例并立即初始化某些属性时,这非常有用。在 Java 中,这是使用Builder
模式完成的。在 Kotlin 中,您可以apply()
在任何对象上使用,即使它不支持Builder
模式。
该apply()
函数在 Kotlin 标准库中定义如下(简化):
fun <T> T.apply(block: T.() -> Unit): T {
block()
return this
}
Run Code Online (Sandbox Code Playgroud)
您可以以类似的方式使用接收器定义您自己的 lambda。
归档时间: |
|
查看次数: |
2080 次 |
最近记录: |