Android初学者

kotlin的with、apply

2019-07-26  本文已影响0人  YueDev

with和apply是kotlin标准库中的函数,用来对一个对象进行多次操作,例如一个函数alphabet(),作用是返回ABC字母表的字符串。

fun alphabet(): String {
    val result = StringBuilder("alphabet:\n")
    for (letter in 'A'..'Z') {
        result.append(letter)
    }
    result.append("\nI know the alphabet")
    return result.toString()
}

//返回值
//    alphabet:
//    ABCDEFGHIJKLMNOPQRSTUVWXYZ
//    I know the alphabet

上边函数中result: StringBuild一直在用,如果用with的话,可以这么写

fun alphabetWith() = with(StringBuilder()) {
        append("alphabet:\n")
        for (letter in 'A'..'Z') {
            this.append(letter)
        }
        append("\nI know the alphabet")
        this.toString()
    }

这样通过with把StringBuild委托给后边lambda,lambda里可以直接用this指代StringBuild或者直接调用StringBuild的方法。

with的返回值是lambda的值,即最后lambda的一行,而apply返回的是整个对象:

fun allphabetApply() = StringBuilder().apply {
    append("alphabet:\n")
    for (letter in 'A'..'Z') {
        append(letter)
    }
    append("\nI know the alphabet")
}.toString()

apply用起来和java里的构造者模式很像,比如我们自定义个View,采用构造者模式来初始化View的各个属性,用apply很简单就可以实现:

fun createMyTextView(context: Context) = MyTextView(context).apply {
    text = "my text view"
    textSize = 20.0
    setPadding(10,10,10,10)
}

另外关与最开头的例子,kotlin有一个buildString函数,会自动生成一个StringBuild,并返回它的toString,用的就是apply实现的:

fun alphabetBuildString() = buildString {
    append("alphabet:\n")
    for (letter in 'A'..'Z') {
        append(letter)
    }
    append("\nI know the alphabet")
}
上一篇 下一篇

猜你喜欢

热点阅读