Kotlin 标准库函数
apply
说明:可以当做配置函数
,可以在其 lambda 中直接执行调用者的内部函数,方便对其进行配置,且会返回配置好的调用者。
示例代码:
import java.io.File
//对 file 设置可读写
fun main(){
//不使用 apply
val file = File("path")
file.setReadable(true)
file.setWritable(true)
file.setExecutable(false)
//使用 apply
val file = File("path").apply{
setReadable(true)
setWritable(true)
setExecutable(false)
}
}
let
说明:let 可以将调用者传入其 lambda 中,使用 it 来代表调用者,且 let 会返回 lambda 的最后一行。
示例代码:
// 计算集合中第一个数的平方值
fun main(){
// 不使用 let
val firstElement = listOf(3,2,2).first()
val result = firstElement * firstElement
// 使用 let
val resutl = listOf(3,2,1).let{
it * it
}
}
run
说明:run 函数基本上跟 apply 函数相似,只是在返回值上有所不同,run 不返回调用者,返回的是 lambda 的结果,也就是 true 或者 false。
示例代码:
import java.io.File
// 判断 file 中是否包含指定字符串
fun main(){
//不使用 run
val file = File("path")
val fileContent = file.readText()
val containsResult = fileContent.contains("great")
//使用 run
val file = File("path")
val containsResult = file.run{
readText().contains("great")
}
}
扩展使用:
说明:run 函数也可以执行函数引用
示例代码:
fun main(){
"Benjamin"
.run(::isLong)
.run(::showMessage)
.run(::println)
}
fun isLong(name: String) = name.length >= 5
fun showMessage(isLong: Boolean){
return if(isLong){
"Name is too long."
}else{
"Please rename."
}
}
with
说明:with 在功能上与 run 函数一样,区别只是在调用方式上,with 是将调用者作为自己的参数传递进来的。
示例代码:
run main(){
val resutl = with("Benjamin"){
lenth >= 10
}
}
also
说明:also 的功能上同 let 一样,都是将调用者传递到 lambda 中,不同点是在返回值上,let 返回的是 lambda 的结果,而 also 的返回值是调用者。针对这个特点,also 就非常适合用在针对同一对象的连续调用上,比如:链式调用
示例代码:
import java.io.File
fun main(){
var fileContent = ""
File("path")
.also{
print(it.name)
}.also{
fileContent = it.readContent()
}
println(fileContent)
}
takeIf
说明:takeIf 从功能上说有点类似于 if,需要根据其 lambda 中的表达式结果来决定返回值是什么,当lambda 中的表达式结果是 true 时,返回的是调用者,反之返回的是 null。
示例代码:
import java.io.File
fun main(){
val fileContent = File("path").takeIf{
it.canRead() && it.canWrite()
}?.readContent()
}
takeUnless
说明:跟 takeIf 相反,只有 lambda 中的返回值是 false 时,才会返回调用者对象,否则返回 null 。
示例代码:
import java.io.File
fun main(){
val fileContent = File("path").takeUnless{
it.isHidden
}?.readContent()
}