kotlin的with、apply

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")
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容