深色模式
作用域函数(Scope Function)
用法
标准库包含5个作用域函数:
let
, run
, with
, apply
, also
这几个函数的区别:
函数 | 上下文对象的引用方式 | 返回值 | 是否扩展函数 |
---|---|---|---|
let | it | Lambda 表达式的结果值 | 是 |
run | this | Lambda 表达式的结果值 | 是 |
run | - | Lambda 表达式的结果值 | 不是: 不使用上下文对象来调用 |
with | this | Lambda 表达式的结果值 | 不是: 上下文对象作为参数传递 |
apply | this | 上下文对象本身 | 是 |
also | it | 上下文对象本身 | 是 |
可见,它们的区别主要在于两点:
- 引用上下文对象的方式(某些情况无上下文对象)
- 返回值
let:
kotlin
val resultList = numbers.map { it.length }.filter { it > 3 }
println(resultList)
改写为:
kotlin
numbers.map { it.length }.filter { it > 3 }.let {
println(it)
}
或:
kotlin
numbers.map { it.length }.filter { it > 3 }.let(::println)
另外:takeIf()和takeUnless()
除作用域函数外,标准库还提供了 takeIf
函数和 takeUnless
函数。这些函数可以在链式调用中加入对象的状态检查。
🌰:
kotlin
fun displaySubstringPosition(input: String, sub: String) {
input.indexOf(sub).takeIf { it >= 0 }?.let {
println("The substring $sub is found in $input.")
println("Its start position is $it.")
}
}
不使用takeIf()
,🌰:
kotlin
fun displaySubstringPosition(input: String, sub: String) {
val index = input.indexOf(sub)
if (index >= 0) {
println("The substring $sub is found in $input.")
println("Its start position is $index.")
}
}
参考
《Scope Functions》(Kotlin官方文档)