阅读 47

kotlin 高阶函数

class TestDemo {
    val testDemo = TestDemo()
    fun use() {
        val result = "123".let {
            Log.i("abs", "12312313123123")
//            "我是返回类型,我可以是任何类型。如Int,String,obj,xxxxx"
            1
        }
        Log.i("abs", "result==$result")

        // apply & also 的区别
        val sc = testDemo.apply {
            //T.() 相当于可以直接get该对象的字段。不需要  对象.属性
        }


        val k = testDemo.also {
            //(T) ->  返回当前对象,对象变量名字叫it
        }

        //这个t,返回类型是Int,值是1
        val t = "123".run {
            1
        }
    }

    /*
            1.首先这个let函数是拓展函数,任务对象都可以调用,并且是带有泛型的方法,<T,R>
            2.block(块)方法的块,代码块的意思。(T)传入的参数的类型是调用者的类型
            3.改block返回的类型是R,是任务类型
            4.let拓展方法返回的R,其实就是"123".let {}块里面最后一行返回的R,如上面的字符串,或者是1
    */
    inline fun <reified T, reified R> T.let(block: (T) -> R): R {
        Log.i("abs", "TT==" + T::class.java)
        Log.i("abs", "RR==" + R::class.java)
        return block(this)
    }


    /**
     * 1.apply方法是一个拓展函数,参数是一个方法块,方法块返回值是void,
     * 2.apply方法返回的是调用者的类型,并返回当前调用者
     * 3.T.() -> Unit 当前调用者调用自身一个匿名的空方法,如上,
     */
    inline fun <T> T.apply(block: T.() -> Unit): T {
        block()
        return this
    }

    /**
     * 1.aloso 拓展方法,入参是一个方法块,方法块的入参是T,调用者,返回是void,
     * 2.aloso  方法返回的是T类型,即是调用者本身的类型,
     */
    inline fun <T> T.also(block: (T) -> Unit): T {
        block(this)
        return this
    }


    //run 方法,参数接收一个方法块,方法块T调用空方法,,run{}最后一行,可以返回任何类型
    inline fun <T, R> T.run(block: T.() -> R): R {
        return block()
    }
}
复制代码
文章分类
Android
文章标签