作用域函数在 Kotlin 中非常有用,可以帮助我们管理代码并编写清晰易读的代码。 Kotlin 标准库中包含几个函数,其唯一目的是在对象的上下文中执行一段代码块。当我们在对象上调用这样的函数并提供一个 lambda 表达式时,它形成了一个临时作用域。在这个作用域中,我们可以通过对象的属性和函数来访问该对象,而无需使用对象的名称。这些函数被称为作用域函数。Kotlin 中共有五个作用域函数:let、run、with、apply 和 also。 作用域函数可以使代码更加清晰、易读和简洁,这是 Kotlin 语言的主要特点之一。 作用域函数的类型有五种: 这些函数之间的主要区别有两点: 作用域函数比较表: 函数上下文对象引用返回值letitlambda 结果runthislambda 结果withthislambda 结果applythis对象本身alsoit对象本身 使用场景:let 函数经常用于处理可空对象以避免空指针异常。可以使用安全调用操作符(?.)结合 let 来进行空安全调用。它仅在非空值时执行代码块。 示例: 使用场景:推荐使用 with 在上下文对象上调用函数,而不提供 lambda 结果。在代码中,我们可以将 with 理解为“对于这个对象,执行以下操作”。 示例: 使用场景:run 在 lambda 中既可以初始化对象,又可以计算返回值。使用 run 我们可以进行空安全调用以及其他计算操作。 示例: 使用场景:我们建议在不返回值的代码块中使用 apply,主要用于操作接收者对象的成员。最常见的用例是对象配置。我们可以理解这样的调用为“将以下赋值应用于该对象”。 示例: 以上是 Kotlin 中的作用域函数及其使用场景。通过使用这些作用域函数,可以更好地管理代码和对象,使代码更加清晰、易读和简洁。希望本文对您理解 Kotlin 中的作用域函数有所帮助。什么是作用域函数?
关于 this 和 it
val adam = Person("Adam").apply {
age = 20 // 与 this.age = 20 相同
city = "London"
}
println(adam)
fun getRandomInt(): Int {
return Random.nextInt(100).also {
writeToLog("getRandomInt() 生成的值为 $it")
}
}
val i = getRandomInt()
println(i)
使用作用域函数的应用场景
let 函数
// 链式调用
val numbers = mutableListOf("one", "two", "three", "four", "five")
val resultList = numbers.map { it.length }.filter { it > 3 }
println(resultList)
// 使用 let
val numbers = mutableListOf("one", "two", "three", "four", "five")
numbers.map { it.length }
.filter { it > 3 }
.let { println(it) } // 可以继续添加更多函数调用
val str: String? = "Hello"
// processNonNullString(str) // 编译错误:str 可能为空
val length = str?.let {
println("let() 在 $it 上调用")
processNonNullString(it) // OK:'it' 在 '?.let { }' 内部不为空
it.length
}
with 函数
val numbers = mutableListOf("one", "two", "three")
with(numbers) {
println("'with' 被调用,参数为 $this")
println("它包含 $size 个元素")
}
run 函数
val service = MultiportService("https://example.kotlinlang.org", 80)
val result = service.run {
port = 8080
query(prepareRequest() + " to port $port")
}
val firstName: String? = null
var middleName: String? = null
var lastName: String? = null
middleName = "M "
lastName = "Vasava"
firstName?.run {
val fullName = this + middleName + lastName
print(fullName) // 仅打印 M Vasava
}
apply 函数
val adam = Person("Adam").apply {
name = "Adam"
age = 20
city = "London"
}
println(adam)