with、run、apply、let、also 函数区别

2022-02-08  本文已影响0人  戎码虫

with 传参可以是任意对象,上下文为this,返回值为最后一行的结果

    val withResult = with(StringBuffer()) {
        println("start")
        append("hello")
        append(" ")
        append("world")
        println("end")
        toString()
    }
    println(withResult)

run 任意对象调用,上下文为this,返回值为最后一行的结果

 val runResult = StringBuffer().run {
        println("start")
        append("hello")
        append(" ")
        append("world")
        println("end")
        toString()
    }
    println(runResult)

apply 任意对象调用,上下文为this,返回值为对象本身

    val applyResult = StringBuffer().apply {
        println("start")
        append("hello")
        append(" ")
        append("world")
        println("end")
    }
    println(applyResult.toString())

let 任意对象调用,上下文为it,返回值为最后一行结果

 val letResult = StringBuffer().let {
        println("start")
        it.append("hello")
        it.append(" ")
        it.append("world")
        println("end")
        it.toString()
    }

    println(letResult)

以上不同写法运行结果一致:

start
end
hello world

also 任意对象调用,上下文为it,返回值为最后一行结果

     val alsoResult = StringBuffer().also {
        println("start")
        it.append("hello")
        it.append(" ")
        it.append("world")
        println("end")
    }

    println(alsoResult.toString())

以上不同写法运行结果一致:

start
end
hello world

run、apply、let 、also都支持链式调用

StringBuffer().run{  }.run{  }
StringBuffer().apply{  }.apply{  }
StringBuffer().let{  }.let{  }
StringBuffer().also{  }.also{  }
标准函数 调用方式 上下文 返回值
with 任意对象参数传入 this 最后一行结果
run 任意对象调用 this 最后一行结果
apply 任意对象调用 this 对象本身
let 任意对象调用 it 最后一行结果
also 任意对象调用 it 对象本身
上一篇下一篇

猜你喜欢

热点阅读