apply():可以看做是一个配置函数,传入一个接收者,然后调用一系列方法配置它以便使用,最后返回配置好的接收者
fun main() {
//常规写法
val file1 = File("D://file.txt")
file1.setExecutable(true)
file1.setReadable(true)
file1.setWritable(true)
//使用apply函数来完成上述操作 并返回apply
//调用一个个函数时,变量名被省略掉了,因为在lambda表达式里,apply能让每个配置函数都
//作用于接收者,这种行为又叫做 相关作用域
val apply:File = file1.apply {
setExecutable(true)
setReadable(true)
setWritable(true)
}
}
复制代码
let():let函数使某个变量作用于其Lambda表达式里,让it关键字能引用它,与apply比较,let会把接收者传给lambda,而apply什么都不传。匿名函数执行完,apply会返回当前接收者,let会返回lambda的最后一行
val result = listOf(1, 2, 3).first().let {
//返回1*1
it * it
}
复制代码
//结合空安全操作符
fun formatGreeting(guestName: String?): String {
return guestName?.let {
"welcome $it"
} ?: "who are you"
}
复制代码
run():run不返回接收者,返回的是lambda的结果
val file1 = File("D://file.txt")
val run = file1.run {
//readText()一次性读取文件内容
readText().contains("abc")
}
var str = "abcdefghijklmn"
str.run {
//判断长度是否大于10 并返回
length>10
}
复制代码
run函数支持链式调用
var str = "abcdefghijklmn"
//使用 函数引用 链式调用的过程是
//1.执行isLong函数
//2.将第一步的结果传给showMessage函数
//3.将第二步的结果传给print函数打印
str.run(::isLong).run(::showMessage).run(::print)
fun isLong(name: String) = name.length > 10
fun showMessage(isLong: Boolean): String {
return if (isLong) {
"Too Long"
} else {
return "not too long"
}
}
复制代码
with():with是run函数的变体,with的调用方式不同,调用with时需要 值参作为其第一个参数传入
//使用with判断长度大于10
with(str){
length>10
}
复制代码
also():also函数和let函数功能相似,和let一样,also把接收者作为值参传给lambda,但是有一点不同:also返回接收者对象,而let返回lambda结果
利用这个差异,also适合针对同一原始对象,利用副作用做事,also返回接收者对象,就可以基于原始接收者对象执行额外的链式调用
//声明一个String集合
var fileContents:List<String>
File("D://file.txt").also {
//打印文件名
print(it.name)
}.also {
//将文件的字符串添加到集合中
fileContents = it.readLines()
}
println(fileContents)
复制代码
takeIf():takeIf需要判断lambda中提供的条件表达式,给出true、false结果,如果判断为true,从takeIf函数返回接收者对象,如果是false,则返回null。如果需要判断某个条件是否满足,再决定是否可以赋值变量或者执行某项任务,takeIf就非常有用
val readResult:String = File("D://file.txt").takeIf {
//文件存在并且可以读
it.exists() && it.canRead()
//读文件
}?.readText() ?: "null"
print(readResult)
复制代码
takeUnless():是takeIf的辅助函数,只有判断你给定的条件结果是false时,takeUnless才会返回原始接收者对象
File("D://file.txt").takeUnless {
//文件隐藏 不可见
it.isHidden
//读文件
}?.readText() ?: "null"
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END