Kotlin 基础精华篇
Kotlin 内联函数let、with、run、apply、also
Kotlin 协程学习总结
本文将用到的对象UserInfo
class UserInfo {
var id = 0L
var name = ""
var phone = ""
var email = ""
var type = 0
fun getString() = "$name, $phone, $email"
fun setName(familyName: String, givenName: String) {
this.name = "$givenName, $familyName"
}
fun setEmail(vararg emails: String) {
this.email = emails.toString()
}
}
一、let
let扩展函数的实际上是一个作用域函数,最后一行可作为返回值return
使用场景:
1.使用let函数处理需要针对一个可null的对象统一做判空处理
2.明确一个变量所处特定的作用域范围内,在作用域范围内用it来代替变量
val result = userInfo?.let {
it.id = 12L
it.phone = "13266668888"
it.email = getEmail()
//最后一行为返回值, 若无需要也可无返回值
it.getString()
}
//若userInfo是null,则result是null;
//若userInfo不为null,则result为13266668888
println(result)
二、with
将某对象作为函数的参数,在函数块内可以通过 this 指代该对象。返回值为函数块的最后一行或指定return表达式。
使用场景:
需要多次调用同一个类的多个方法或属性时,可以省去类名重复,直接调用类的方法或属性,经常用于Android中RecyclerView中onBinderViewHolder
if (userInfo != null) {
val result = with(userInfo!!) {
id = 12L
phone = "123567890"
email = getEmail()
//最后一行为返回值, 若无需要也可无返回值
getString()
}
println(result) //输出 13266668888
}
三、run
run函数实际上相当于let和with两个函数的结合体,run函数只接收一个lambda函数为参数,以闭包形式返回,返回值为最后一行。
使用场景:
适用于let,with函数任何场景,并且弥补了let、with的缺点。
let 在函数体内必须使用it参数替代对象
with 要求传入对象非空(否则就得多次判空,体现不出with的优势)
val result = userInfo?.run {
id = 12L
phone = "123567890"
email = getEmail()
//最后一行为返回值, 若无需要也可无返回值
getString()
}
println(result) //输出 13266668888
四、apply
与run功能类似,只是返回值的不同。
run 是返回最后一行代码的值
apply 是返回传入对象本身
使用场景:
一般用于一个对象实例初始化的时候,需要对对象中的属性进行赋值
val result = userInfo?.apply {
id = 12L
phone = "123567890"
email = getEmail()
getString()
}
println(result) //输出 com.example.xxx.UserInfo@6b884d57
五、also
与let功能类似,只是返回值的不同。
let 是返回最后一行代码的值
also 是返回传入对象本身
使用场景:
let适用的场景,或多个扩展函数链式调用
var result = userInfo?.also {
it.id = 12L
it.phone = "13266668888"
it.email = getEmail()
it.getString()
}
println(result) //输出 com.example.xxx.UserInfo@6b884d57
//将原本不支持链式调用的UserInfo使用also链起来
result = userInfo?.also {
it.id = 12L
}?.also {
it.setEmail("123@qq.com", "456@qq.com")
}?.also {
it.setName("li", "xiaoming")
}
网友评论