美文网首页
Kotlin 内联函数let、with、run、apply、al

Kotlin 内联函数let、with、run、apply、al

作者: 木木禾木 | 来源:发表于2020-08-26 11:08 被阅读0次

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")
        }

相关文章

网友评论

      本文标题:Kotlin 内联函数let、with、run、apply、al

      本文链接:https://www.haomeiwen.com/subject/nllxsktx.html