10天学会kotlin DAY2 匿名函数 与 Lambda

函数类型的隐式返回


//    第一步:函数输入输出的声明

    val methodAction: () -> String



//    第二步:对上面函数的实现

    methodAction = {

        val inputValue = 666

//        匿名函数,不要写return, 最后一行就是返回值

        "$inputValue tiger"

    }

//    第三步:调用函数

    println(methodAction());



3、函数参数





//   可以直接将上面的 第一步:函数输入输出的声明  和 第二步:对上面函数的实现  合并

    val methodAction: (Int, Int, Int) -> String = {

        number1, number2, number3 ->

        val inputValue = 666

        "$inputValue tiger 参数一:$number1 参数二:$number2 参数三:$number3"

    }



//    第三步:调用函数

    println(methodAction(1, 2, 3))



4、it 关键字特点



//   在kotlin中 如果传入的参数只有一个,kotlin 都会自动生成一个it 隐式参数

    val methodAction: (String) -> String = {

        "$it tiger"

    }



    println(methodAction("666"))



    val methodAction2: (Double) -> String = {

        "$it tiger"

    }



    println(methodAction2(666.0))



    val methodAction3: (Int) -> String = {

        "$it tiger"

    }



    println(methodAction3(666))



5、匿名函数的类型推断



//    匿名函数,类型推断为String (返回类型,根据返回参数而定,可返回任意类型的参数)

//    方法名 : 必须指定 参数类型 和 返回类型

//    方法名 = 类型推断返回类型

    val methodValue = { num1: Double, num2: Float, num3: Int ->

        "num1: $num1, num2: $num2: num3: $num3"

    }



    println(methodValue(32.2, 33.4f, 44))



6、Lambda


匿名函数 属于Lambda


//    匿名函数 == Lambda 表达式

    val addResultMethod = {number1: Int, number2: Int ->

        "两个求和 ${number1 + number2}"

    }



    println(addResultMethod(3, 6))

    

//    匿名函数 入参 Int            返回Any 类型      (Any  类型于Java 中的 Object )

//    Lambda 表达式的参数 Int,     Lambda 表达式的结果Any 类型

    val  weakResultMethod = {number: Int ->

        when(number){

            1 -> "周一"

            2 -> "周二"

            3 -> "周三"

            4 -> "周四"

            5 -> "周五"

            else -> -1

        }

    }     // weakResultMethod 函数 (Int) -> Any



    println(weakResultMethod(3))



7、函数中定义参数 是函数的函数





//    调用函数

    loginAPI("tiger", "123456"){

        msg: String, code: Int ->

        println("最终的登录情况是:msg: $msg code: $code")

    }



//  模拟服务器的数据

const val USER_NAME_SAVE_DB = "tiger"

const val USER_PASS_SAVE_DB = "123456"



// 模仿前端登录

fun loginAPI(userName: String, passWord: String, responseResult: (String, Int) -> Unit) {

    if (userName == null || passWord == null){

        // 出现问题,终止程序  抛出异常  Nothing(是一个编译期的抽象概念,只有需要将一个函数显示的标记为无法完成时,才有用到Nothing类型的必要)

        TODO("用户名或密码错误")

    }



    if (userName.length > 3 && passWord.length > 3){

        if (wbeServerLoginApi(name = userName, pwd = passWord)){

            responseResult("login success", 200)

        }else{

            responseResult("login error", 500)

        }

    }else{

        TODO("用户名或密码错误")

    }

}



// 模拟登录操作

private fun wbeServerLoginApi(name: String, pwd: String): Boolean {



    return name == USER_NAME_SAVE_DB && pwd == USER_PASS_SAVE_DB

}



8、函数内联


如果函数参数有Lambda ,尽量使用 inline 关键字,这样内部会做优化,减少函数开辟,对象开辟,的性能损耗

使用内联,相当于C++ #define 宏定义,宏替换,会把代码替换到调用处,没有任何函数的开辟, 对象的开辟,造成性能损耗

如果不使用内联,在调用端,会生成多个对象来完成Lambda 的调用(造成性能损耗)


// 模仿前端登录 inline 内联关键字

inline fun loginAPI(userName: String, passWord: String, responseResult: (String, Int) -> Unit) {

    if (userName == null || passWord == null){

        // 出现问题,终止程序  抛出异常  Nothing(是一个编译期的抽象概念,只有需要将一个函数显示的标记为无法完成时,才有用到Nothing类型的必要)

        TODO("用户名或密码错误")

    }



    if (userName.length > 3 && passWord.length > 3){

        if (wbeServerLoginApi(name = userName, pwd = passWord)){

            responseResult("login success", 200)

        }else{

            responseResult("login error", 500)

        }

    }else{

        TODO("用户名或密码错误")

    }

}



9、函数引用



//    Lambda 属于函数类型对象,需要把methodResponseResult 普通函数 通过 :: 转变成 函数类型的对象(函数引用)

    loginAPI("tiger", "123456", ::methodResponseResult)



//定义一个函数

fun methodResponseResult(msg: String, code: Int){

    println("最终的登录情况是:msg: $msg code: $code")

}



//  模拟服务器的数据

const val USER_NAME_SAVE_DB = "tiger"

const val USER_PASS_SAVE_DB = "123456"



// 模仿前端登录

inline fun loginAPI(userName: String, passWord: String, responseResult: (String, Int) -> Unit) {

    if (userName == null || passWord == null){

        // 出现问题,终止程序  抛出异常  Nothing(是一个编译期的抽象概念,只有需要将一个函数显示的标记为无法完成时,才有用到Nothing类型的必要)

        TODO("用户名或密码错误")

    }



    if (userName.length > 3 && passWord.length > 3){

        if (wbeServerLoginApi(name = userName, pwd = passWord)){

            responseResult("login success", 200)

        }else{

            responseResult("login error", 500)

        }

    }else{

        TODO("用户名或密码错误")

    }

}



// 模拟登录操作

fun wbeServerLoginApi(name: String, pwd: String): Boolean {



    return name == USER_NAME_SAVE_DB && pwd == USER_PASS_SAVE_DB

}



10、函数类型作为返回类型



    val showMethod = show("tiger")

//    showMethod 是 show 函数的返回值,只不过这个返回值,是一个函数

//    show  ==  匿名函数

    println(showMethod("王漂亮", 18))



fun show(info: String) :(String, Int) -> String {
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值