一、let 扩展函数
Kotlin标准库函数let可用于范围确定和空检查。当调用对象时,let执行给定的代码块并返回其最后一个表达式的结果。对象可以通过引用(默认情况下)或自定义名称在块中访问。
let扩展函数源码
let.kt文件代码
fun main() {
println("isEmpty = $isEmpty")
printNonNull(null)
printNonNull("my string")
printIfBothNonNull("First","Second")
//下面是运行结果
//test
//isEmpty = false
//Printing "null":
//Printing "my string":
// my string
//
//First : Second
}
val isEmpty = "test".let {
println(it) // 2
it.isEmpty()
}
fun printNonNull(str:String?){
println("Printing \"$str\":")
str?.let {
print("\t")
println(it)
println()
}
}
fun printIfBothNonNull(strOne: String?, strTwo: String?) {
strOne?.let { firstString ->
strTwo?.let { secondString ->
println("$firstString : $secondString")
println()
}
}
}
运行结果
二、run 扩展函数
与let类似,run是标准库中的另一个作用域函数。基本上,它做同样的事情:执行一个代码块并返回其结果。
不同的是,在内部运行对象是通过this访问的。当您想要调用对象的方法而不是将其作为参数传递时,这是很有用的。
run扩展函数源码
run.kt文件代码
fun getNullableLength(ns: String?) {
println("for \"$ns\":")
val resutl = ns?.run {
println("\tis empty? " + isEmpty())
println("\tlength = $length")
length
}//返回最后一行
println("resutl = $resutl")
}
fun main(){
getNullableLength(null)
getNullableLength("")
getNullableLength("some string with Kotlin")
//下面是运行结果
//for "null":
//resutl = null
//for "":
// is empty? true
// length = 0
//resutl = 0
//for "some string with Kotlin":
// is empty? false
// length = 23
//resutl = 23
}
运行结果
三、with函数
With是一个非扩展函数,可以简洁地访问其参数的成员:在引用其成员时,可以省略实例名。
with函数源码
with.kt文件代码
fun main() {
val personal = Personal("test", 20)
val withResult = with(personal) {
println("name = $name")
println("age = $age")
21
22
}
println("withResult = $withResult")
//name = test
//age = 20
//withResult = 22
}
class Personal(var name: String, var age: Int)
运行结果
四、apply扩展函数
apply在对象上执行代码块并返回对象本身。在块内部,对象被this引用。这个函数对于初始化对象很方便。
在实际项目用来显示列表数据的RecyclerView.Adapter里onBindViewHolder方法里使用apply或with函数较多
apply扩展函数源码
apply.kt文件代码
fun main() {
val jake = Person()
val stringDescription = jake.apply {
name = "Jake"
age = 30
about = "Android developer"
}.toString()
println("stringDescription = $stringDescription")
//stringDescription = Person(name=Jake, age=30, about=Android developer)
}
class Person() {
var name: String? = null
var age: Int = 20
var about: String? = null
override fun toString(): String {
return "Person(name=$name, age=$age, about=$about)"
}
}
运行结果
五、also扩展函数
它也像apply一样工作:它执行一个给定的块并返回被调用的对象。在块内部,对象被它引用,所以它更容易作为参数传递。这个函数可以方便地嵌入其他操作,比如在调用链中登录。
also扩展函数源码
also.kt文件代码
fun main() {
val jake = Person2().also {
println(it)
}
getPerson().also {
it.token?.let { tempToen -> login(tempToen) }
}
}
class Person2(
var name: String = "test",
var age: Int = 0,
var about: String? = null
) {
var token: String? = null
override fun toString(): String {
return "Person(name=$name, age=$age, about=$about)"
}
}
fun login(toke: String) {
}
fun getPerson(): Person2 = Person2()
运行结果
推荐
Kotlin: 协程的四种启动模式(CoroutineStart)