摘要说明
函数标准库常用的有:
1、apply:
apply函数作为一个配置函数,可以传入一个接收者,然后调用一系列函数来配置它以方便使用,如果提供lambda给apply函数执行,它会返回配置好的接收者
使用介绍:
java
// 使用apply实现
val file1 = File("E://text_demo.txt").apply {
setReadable(true)
setWritable(true)
setExecutable(false)
}
2、let
能使某个变量作用于其lambda表达式里,让it关键字能引用。let和apply比较,let会把接收者传给lambda,而apply什么都不传,匿名执行完函数;apply会返回当前接收者,而let会返回lambda最后一行。
使用介绍:
java
/**
* let使用
*/
val result = listOf<Int>(3, 2, 1).first().let {
it * it
}
输出结果:9
-----------------------------------------------------------
fun formatGreeting(guestName: String?): String {
return guestName?.let {
"Welcome, $it"
} ?: "what's your name?"
}
formatGreeting(null)
输出结果:what's your name?
----------------------------------------------------------
说明:安全调用允许在可空类型上调用函数
var str: String = "butterfly"
str = str.let {
if (it.isNotBlank()) {
it.capitalize().plus("你好")
} else {
"butterfly"
}
}
println(str)
输出结果:Butterfly你好
3、run
1)光看作用域行为,run和apply差不多,但与apply不同,run函数不返回接收者,run返回的是lambda结果,也就是true或者false。2)执行函数引用
使用介绍:
java
/**
* run函数的使用
*/
// 使用方式1
val file2 = File("E://text_demo.txt")
val result2 = file2.run {
readText().contains("great")
}
println(result2)
输出结果:true
---------------------------------------------------------------
// 使用方式2,调用函数
val isLong = "The people's Republic of China".run(::isLong)
fun isLong(name: String) {
name.length >= 10
}
println(isLong)
输出结果:true
4、with
是run的变体,他们的功能行为是一样的,但with调用方式不同,调用with时,需要值参作为其第一个参数传入
使用介绍:
java
val resultWith = with("The people's Republic of China") {
length >= 10
}
println(resultWith)
输出结果:true
5、also
和let函数功能相似。和let一样also也是把接受者作为参数值传给lambda,但是有一点不同:also返回接收者对象,而let返回lambda结果,因为这个差异,also尤其适合针对同一原始对象,处理事务,既然also返回的是接收者对象,你就可以基于原始接收者对象执行额外的链式调用。
使用介绍:
java
/**
* also函数使用
*/
var fileContents: List<String>
File("E://text_demo.txt")
.also {
println(it.name)
}.also {
fileContents = it.readLines()
}
println(fileContents)
----------------------------------------------------------------------------------
输出结果:
text_demo.txt
[I am happy to join with you today in what will go down in history as the greatest
6、takeIf
takeif函数需要判断lambda中提供的条件表达式,给出true或false结果,如果判断结果是true,从takeIf函数返回接收者对象,如果是false则返回null。如果需要判断某个条件是否满足,再决定是否可以赋值变量或执行某项任务,takeif就非常有用,takeif函数类似于if语句,但它的优势是可以直接在对象实例上调佣避免了临时变量赋值的麻烦
使用介绍:
java
// 如果条件返回false,则文件返回null
val readText = File("E://text_demo.txt")
.takeIf { it.exists() && it.canRead() }
?.readText()
println(readText)
输出结果:文档内容
7、takeUnless
takeif的函数辅助类takeUnless,只有判断你给定的条件 结果是false时,takeUnless(除非)才会返回原始接收者对象
使用介绍:
java
// 核心:takeUnless 是反向操作
val readText = File("E://text_demo.txt")
.takeUnless { it.isHidden }
?.readText()
println(readText)
输出结果:文档内容