这一章节介绍Kotlin标准库中的withapply函数。这些函数非常的方便。你将会发现想它们的许多用处,甚至无需理解如何什么它们。在后面的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中返回值
    }
}

results matching ""

    No results matching ""