《在飞Android Kotlin实战》之let{}、run{}及原理分析篇4

hi各位亲,这一篇接上一篇《在飞Android Kotlin快速入门-apply{}、with{}篇3》,这篇主要说下let{}和run{}。

一:let{}

     上面是let的源码,我们解读下方法体中的具体含义:

     <T,R>:参数是泛型T,R

     T.let(block:(T)->R):T.let意思是T中都会有let(),其中参数(block:(T)->R)是个函数类型,但是参数是调用者本身T

     ():R:   let的返回值就是(block:(T)->R)这个lambda表达式的返回值,即为R。

之前章节提到过,lambda表达式的最后一行是返回值。{}

举个例子:

   class testLet {
        fun testLet() {
            var list = mutableListOf<String>()
            list.add("a")
            var letResult = list.let {
                //it代表的是list
                "a"//letResult结果是String
                1 //letResult结果是int
                it//letResult结果是int结果是MutableList<String>
            }
        }
    }

二:run{}

 上面是run的源码,我们解读下方法体中的具体含义:

    <T,R>:<T,R>:参数是泛型T,R

    T.run(block:T.()->R):T.run()意思是T中有run函数扩展,其中参数(block:T.()->R)是函数类型,同时是T中的函数,R是返回的lambda表达式返回的结果。  转载请注明出处:https://blog.csdn.net/pangzaifei/article/details/85120874

   ():R   :run()返回的结果是R,就是lambda表达式的结果

举个例子:  

  

三:apply{}、with{}、let{}、run{}区别

先看下源码不同:

//apply
@kotlin.internal.InlineOnly
public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this }
//with
@kotlin.internal.InlineOnly
public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()
//let
@kotlin.internal.InlineOnly
public inline fun <T, R> T.let(block: (T) -> R): R = block(this)
//run
@kotlin.internal.InlineOnly
public inline fun <T, R> T.run(block: T.() -> R): R = block()

区别点:

1.是否能单独使用?

     apply{}、let{}、run{}都是需要T的扩展函数,不能单独使用。  with(){}不需要具体的扩展,可以单独使用。

2.是否需要多个参数

    apply{}、let{}、run{}仅需要一个参数,而且还是函数参数lambda。with(){}需要两个参数,第一个是需要操作的T,第二个参数才是函数参数lambda,所以使用with的时候是 with +() +{}

3.返回结果类型不同https://blog.csdn.net/pangzaifei/article/details/85120874

     apply{}:不管lambda返回结果类型是什么,最终的结果都是T的类型。

    with(){}、let{}、run{}:返回结果类型是你lambda表达式的最后一行的类型。

4.是否可以用this

apply、run、with的lambda中可以使用this

let的lambda中不可以使用this

总结:

       在Android开发中会经常使用到这四个函数,用他们的好处是可以保证代码的整洁性和逻辑性,同时每个函数会有不同的返回结果类型,可以在不同的场景选择不同的方法使用,比用java少写很多代码。

Ps:我是在飞~~,只有空闲时间才能更新博客,所以本系列偏快速入门,主要讲实战中经常用到内容,让你快速上手。所以文章尽量简短,敬请谅解,本系列文章默认阅读者已经熟悉java语言,希望我的博客对你有帮助!

相关源码

===补充===

函数回调:在开发中经常会有异步操作的时候,比如网络请求,然后等待个几秒钟才会回来结果,之后使用这些数据。下面的例子就是用函数回调这种形式来解决异步的情况。

    //函数回调begin
    class Student {
        fun goHome(block: (String) -> Unit) {//1.(String)是It的类型是String
            Thread {
                Log.e("fffpzf", "小明在路上....")
                Thread.sleep(3000)//等待3秒后,学生到家了
                var result = "经过3秒后,小明到家了...."
                Log.e("fffpzf", result)
                block.invoke("你需要的值,可以替代it")//上面1处声明了it的类型是String类型你希望的it的值或者类型,可以在此处修改。
            }.start()
        }
    }
    fun TestSutdent() {//此处是it
        var student = Student()
        student.goHome {
            Log.e("fffpzf", "it:$it")
        }

        Log.e("fffpzf", "小明准备回家...")
    }
===
小明准备回家...
小明在路上....
经过3秒后,小明到家了....
it:你需要的值,可以替代it
===
    //函数回调end

有问题可联系q:1660380990邮箱[email protected]

发布了71 篇原创文章 · 获赞 15 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/pangzaifei/article/details/85120874