作用域函数:是Kotlin标准库中的内联函数,作用在对象上时,执行给定的block代码块。
可以在block代码块中通过it,this代表当前对象,进行代码逻辑处理。
公有5种作用域函数: let,run ,with,apply,also
let:在对象上调用时,let执行给定的block代码块并返回其最后一个表达式的结果
用it代表当前对象
val empty = "test".let { // 1
println(it.uppercase())
it.isEmpty() // 3
println()
it
}.let { str: String ->
println("it = str = $str")
val resultStr = str.uppercase()
println("result = $resultStr")
resultStr
}
run,跟let一样,执行给定的block代码块并返回其最后一个表达式的结果,但是当前对象用this表示
val empty2 = "test".run {
println("run = str = $this")
val resultStr = this.uppercase()
println("result = $resultStr")
resultStr
// this.length this可以省去
length
}
with 非扩展函数 ,当前对象用this表示,但是在使用时可以省略this,直接使用对象的属性
常见用法:调用对象方法,调用对象属性等
class Configuration(var host: String, var port: Int)
fun main() {
val configuration = Configuration(host = "127.0.0.1", port = 9000)
with(configuration) {
println("$host:$port")
}
// instead of:
println("${configuration.host}:${configuration.port}")
}
apply : 执行block代码块,并返回对象本身。当前对象用this表示,使用时可以省略
常见用法:初始化对象,并给属性赋值
data class Person(var name: String, var age: Int, var about: String) {
constructor() : this("", 0, "")
}
fun main() {
val jake = Person() // 1
val stringDescription = jake.apply { // 2
this.name = "Jake" // 3
age = 30
about = "Android developer"
}.toString() // 4
println(stringDescription)
}
also 跟apply比较像,执行block代码块并返回当前对象,当前对象用 it 表示
val jake2 = Person("Jake", "30", "Android developer") // 1
jake2.also {
println("A new person ${it.name} was created.")
}
kotlin activity中的简单使用: