美文网首页
Kotlin高阶函数(一)

Kotlin高阶函数(一)

作者: 壹元伍角叁分 | 来源:发表于2021-08-05 22:44 被阅读0次

    一、无返回值的高阶

    写法:

    写法一:

    fun login1(s: String, s1: String, function: (s: String, s1: String) -> Unit) {
        function(s, s1)
    }
    

    写法二:将高阶进行抽离,使用关键字typealias

    typealias Function = (s: String, s1: String) -> Unit
    
    fun login2(s: String, s1: String, function: Function) {
        function(s, s1)
    }
    

    调用:

    login1(s, s1) { s, s1 ->
        println("1111111 s=$s,s1=$s1")
    }
    
    login2(s, s1) { s, s1 ->
        println("222222 s=$s,s1=$s1")
    }
    

    执行顺序

    高阶函数:

    fun show4(isLogin: Boolean, loginMethod: (String) -> Boolean) {
        println("111111 isLogin=$isLogin")
        val loginMethod1 = loginMethod("呵呵呵")
        println("333333 $loginMethod1")
    }
    

    调用高阶函数:

    show4(false) {
        println("22222 $it")
        true
    }
    

    二、有返回值的高阶

    高阶函数:

    fun testLogin(username: String, password: String, loginMethod: (Boolean) -> Boolean) {
        if (username == "张三" && password == "123456") {
            val loginMethod1 = loginMethod(true)
            println("成功?${!loginMethod1}")
        } else {
            val loginMethod1 = loginMethod(false)
            println("失败?${!loginMethod1}")
        }
    }
    

    调用高阶函数:

    testLogin("张三", "123456") {
        !it
    }
    

    三、高阶进阶

    讲解:

    普通函数

    fun myMethod() {
        println("我是method方法")
    }
    

    高阶函数1:

    fun <T, R> T.testMethod(funcation: () -> R): R {
        return funcation()
    }
    

    高阶函数2:T.()相当于是给T来一个匿名函数

    fun <T, R> T.testMethod2(funcation: T. () -> R): R {
        return funcation()
    }
    

    调用

    val a = myMethod().testMethod {
        println("main......testMethod")
        true
    }
    println("a=$a")
    
    val b = myMethod().testMethod2 {
        println("main......testMethod2")
        "哈哈哈哈"
    }
    println("b=$b")
    

    实例:获取字符串长度

    val name2 = "hahah"
    
    /**
     * T.()相当于是给T来一个匿名函数
     */
    fun <T, R> getLength(stringContent: T, lengthMethod: T.() -> R): R {
        return stringContent.lengthMethod()
    }
    
    val stringlength = getLength(name2) {
        length//这句相当于this.length(),this就是T
    }
    println("length111=$stringlength")
    

    源码中的应用:run、let、apply

    val context: Context? = null
    
    //崩溃 kotlin.UninitializedPropertyAccessException: lateinit property context has not been initialized
    val recyclerView: RecyclerView = RecyclerView(context!!)
    
    //不崩溃,如果context为null,不执行
    context?.run { RecyclerView(this) }
    
    //不崩溃,如果context为null,不执行
    context?.let { RecyclerView(it) }
    

    举一反三:

    true的时候才执行某段代码

    fun checkTrue(isTrue: Boolean, mm: () -> Unit) {
        if (isTrue) mm()
    }
    
        checkTrue(true) {
            println("执行了吗.....111111")//执行
        }
    
        checkTrue(false) {
            println("执行了吗.....2222222")//不执行
        }
    
        val myRun = Runnable {
            println("执行了....Runnable thread=${Thread.currentThread().name}")
        }
        checkTrue(true, myRun::run)//执行,相当于调用了myRun的run方法
    

    源码实现:

    run

    public inline fun <T, R> T.run(block: T.() -> R): R {
        contract {
            callsInPlace(block, InvocationKind.EXACTLY_ONCE)
        }
        return block()
    }
    

    let

    public inline fun <T, R> T.let(block: (T) -> R): R {
        contract {
            callsInPlace(block, InvocationKind.EXACTLY_ONCE)
        }
        return block(this)
    }
    

    apply

    public inline fun <T> T.apply(block: T.() -> Unit): T {
        contract {
            callsInPlace(block, InvocationKind.EXACTLY_ONCE)
        }
        block()
        return this
    }
    

    相关文章

      网友评论

          本文标题:Kotlin高阶函数(一)

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