kotlin函数的简略写法

2022-10-31  本文已影响0人  Bfmall

函数的学习笔记###

/**
 * DESC   : kotlin语言的简略写法学习
 * java中写法参考KtBaseFunTestJava03.java
 */
class KtBaseFunTest03 {

    companion object {
        const val TAG = "KtBaseFunTest03"
    }

    /**
     * 其中  回调函数名字      参数           返回类型
     *    loginCallback : (String ,Int) -> Unit)
     */
    private fun login(username: String, password : String,
              loginCallback : (String ,Int) -> Unit) {
        if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) {
            TODO("登陆失败") //出现问题,终止程序
        }
        if ("admin".equals(username) && "123456".equals(password)) {
            loginCallback("login success", 200)
        } else {
            loginCallback("login fail", 100)
        }
    }

    /**
     * 函数中回调函数的三种写法
     */
    fun testLogin() {
        //第一种写法
        login("admin", "123456", { msg: String, code: Int ->
            Log.d(TAG, "登陆结果:msg="+msg+",code="+code)
        })

        //第二种写法
        login("admin", "123456", loginCallback = { msg: String, code: Int ->
            Log.d(TAG, "登陆结果:msg=$msg ,code=$code")
        })

        //第三种写法(kotlin推荐写法)
        login("admin", "123456") { msg: String, code: Int ->
            Log.d(TAG, "登陆结果:msg=${msg} ,code=${code}")
        }

    }


    /**
     * inline 内联函数
     * 此函数有使用lambda表达式作为参数(loginCallback : (String ,Int) -> Unit 此参数为lambda表达式),
     * 就需要使用inline内联函数
     *
     * 原因如下:
     * 如果此函数不使用inline,在调用端,会生成多个对象完成lambda的调用(会造成性能损耗)
     * 如果使用inline,这样内部会做优化,减少函数开辟,对象开辟,减少性能损耗
     *
     * 通过Tools -> Kotlin -> Show kotlin bytecode -> decompiled转成java文件查看
     *
     * 没有使用inline,会再创建一个对象(Function2)null.INSTANCE实例
     * public final void testLogin2() {
     *   this.login2("admin", "123456", (Function2)null.INSTANCE);
     * }
     *
     */
    private inline fun login2(username: String, password : String,
                      loginCallback : (String ,Int) -> Unit) {
        if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) {
            TODO("登陆失败") //出现问题,终止程序
        }
        if ("admin".equals(username) && "123456".equals(password)) {
            loginCallback("login success", 200)
        } else {
            loginCallback("login fail", 100)
        }
    }

    fun testLogin2() {
        login2("admin", "123456", { msg: String, code: Int ->
            Log.d(TAG, "登陆结果:msg=" + msg + ",code=" + code)
        })
    }

    /**
     * 函数引用
     * lambda属于函数类型的对象,需要把loginCallback 普通函数变成 函数类型的对象(函数引用)
     */
    fun testFunUse01() {
        /**
         *      函数对象      普通类型的函数名
         * val callback = ::loginCallback
         */
        val callback = ::loginCallback
        login2("admin", "123456", callback)
    }

    fun loginCallback(msg: String, code: Int) {
        Log.d(TAG, "登陆结果:msg=" + msg + ",code=" + code)
    }

    /**
     * 函数类型作为返回类型
     */
    fun testFunReturn01() {
        //valShowResult1是函数showResult1的返回值类型,为Boolean类型
        val valShowResult1 = showResult1("hello world")
        //valshowNestFunResult1是函数showNestFunResult1的返回值类型,只不过这个返回值依然是个函数
        val valshowNestFunResult1 = showNestFunResult1("函数的返回值类型为匿名函数")

        Log.d(TAG, ""+valShowResult1.toString())
        //valshowNestFunResult1是函数,调用需要传参
        Log.d(TAG, ""+valshowNestFunResult1("zhangs",78))

    }

    fun showResult1(info : String) : Boolean {
        Log.d(TAG, "结果 info=${info}")
        return true
    }

    fun showNestFunResult1(info : String) : (String, Int) -> Boolean{

        //return 返回一个匿名函数
        return { name :String, age:Int ->
            Log.d(TAG, "结果 info=${info} ,参数name="+name+",age="+age)
            true
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读