这一章节介绍Kotlin标准库中的with
和apply
函数。这些函数非常的方便。你将会发现想它们的许多用处,甚至无需理解如何什么它们。在后面的11.2.1节,你将会看到如何为你的需要声明一个相似的函数。
但是,这一节的解释却是帮助你熟悉Kotlin的独有特性。这个特性对Java不可用:调用lambda内部的不同对象的方法,而无需额外的修饰符的能力。这样的lambda叫做带有接收器的lambda(lambdas with receivers)。我们来看看使用了带有接收器的lambda的with
函数。
5.5.1 with函数
许多语言都有这样的一个特殊语句:你可以用来对同一个对象执行多个操作而无需重复这个对象的名字。Kotlin也有这样的特性。但是它作为一个叫做with
的库函数来提供,而不是语句。
来看看它是如何个有用法。考虑下面的例子,你将会使用with
重构它:
fun alphabet(): String {
val result = StringBuilder()
for (letter in 'A'..'Z') {
result.append(letter)
}
result.append("\nNow I know the alphabet!")
return result.toString()
}
>>> println(alphabet())
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Now I know the alphabet!
在这个例子中,你在result
实例中调用了多个不同的方法。你在每一个调用中重复了result
。这还不算太糟。但是,如果你用到的表达式更长或者重复的更加频繁呢?
下面是用with
重写的代码:
fun alphabet(): String {
val stringBuilder = StringBuilder()
return with(stringBuilder) { // 1 在你调用的方法中制定接收器的值
for (letter in 'A'..'Z') {
this.append(letter) // 2 通过显式的“this”调用接收器值的方法
}
append("\nNow I know the alphabet!") // 3 调用方法,忽略“this”
this.toString() // 4 从lambda中返回值
}
}