本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点
apply
apply函数可以看作是一个配置函数,可以传入一个接收者,然后调用一系列函数来配置以便使用,如果提供lambda给apply函数执行,将返回配置好的接收者
apply能让每个配置函数都作用于接收者
val file1 = File("C://Android").apply {setExecutable(false)setReadable(true)setWritable(true)
}
let
能使某个变量作用于其Lambda表达式里,让it关键字能引用它。
fun main() {val result = listOf(3,2,1).first().let {it*it}println(result)
}fun formatName(name:String?): String {return name?.let { "Whelcome, $it" } ?: "name?"
}
run
-
和apply差不多,但返回的是lambda的执行结果,而apply返回的是接收者
-
可以执行函数引用
-
多个函数引用可以链式调用
fun main() {
var file = File(“D:test.txt”)
val result = file.run {
readText().contains(“hava”)
}
println(result)
//执行函数引用
“hhhhh”
.run(::isLong)
.run(::showTip)
.run(::println)
}fun isLong(name:String) = name.length >= 3
fun showTip(isLong:Boolean) :String {
return if (isLong){
“too long”
}else{
“OK”
}
}
with
是run函数的变体,功能行为一样,with的调用方式不同,with需要值参作为其第一个参数传入
fun main() {val result = "hkjkj".run { length >=3 }println(result)val result1 = with("hkjkj"){length>=3}println(result1)
}
also
和let相似,需要把接收者值参传给lambda,但also返回接收者对象。also尤其适合针对同一原始对象,可以基于原始接收者对象执行额外的链式调用
fun main() {var fileContent:List<String>var reuslt = File("D://Android").also { println(it.name) }.also { fileContent = it.readLines() }println(fileContent)
}
takeif
takeif函数需要判断lambda中提供的条件表达式的结果,如果是true,takeif函数返回接收者对象,如果是false,返回Null。
如果需要判断某个条件是否满足,再决定是否可以赋值变量或执行某项任务,takeif就非常有用
fun main() {val result = File("D://Android").takeIf { it.exists() && it.canRead() }?.readText()println(result)
}
takeUnless
与takeif的返回结果情况相反,返回为false才会返回
let、apply和run
函数 | 入参 | 功能 | 返回值 |
---|---|---|---|
let | 当前调用者,可以用it代替 | 可以对参数it进行操作 | 返回lambda的结果 |
apply | 无 | 调用当前对象的一系列函数 | 返回接收者 |
run | 无 | 调用接收者的一系列函数,还可以执行函数引用,也就是调用其他函数 | 返回lambda的结果 |
let会把接收者传给lambda,而apply什么都不传;匿名函数执行完,apply会返回当前的接收者,而let会返回lambda的最后一行
欢迎关注我的公众号查看更多精彩文章!