Android 知识Kotlin 知识

Kotlin 有用小细节记录(1)

2021-11-30  本文已影响0人  zcwfeng

知识点

25.Kotlin语言的函数参数学习
26.Kotlin语言的it关键字特点
27.Kotlin语言的匿名函数的类型推断
28.Kotlin语言的lambda学习
29.在函数中定义参数是函数的函数
30.Kotlin语言的简略写法学习
31.Kotlin语言的函数内联学习
32.Kotlin语言的函数引用学习
33.Kotlin语言的函数类型作为返回类型
34.Kotlin语言的匿名函数与具名函数

内置函数和举例

计算字符个数

val len2 =  "Davidaaa".count{
        it == 'a'
    }

    println(len2)

函数的隐式返回

 val methodAction: () -> String = {
        "methodAction"
    }

    println(methodAction())

---------
 val methodAction: (Int, Int, Int) -> String = { n1, n2, n3 ->
        "methodAction ${n1},${n2},${n3}"
    }

    println(methodAction(1,2,3))

匿名函数推断

  val method1 = {v1:Double,v2:Float,v3:Int->
        "v1:$v1,v2:$v2,v3:$v3"
    }
    println(method1(33.0,34.5f,44))
    val method2={
        444.44f
    }
    
    val method3={number:Int->
        number
    }

上面的匿名函数也是Lambda

val resultMethod = {number:Int->
    when(number){
        1->"1111111"
        2->"2222222"
        else -> -1
    }
}//(Int)->Any

lambda 的表达式结果是Any类型

参数是函数的函数


const val USER_NAME = "aaaa"
const val PASSWD_VALUE = "cccccccccc";

// 在Java中responseResult 应该是传入的接口
fun loginAPI(username: String, userpwd: String, responseResult: (String, Int) -> Unit) {
    if (username == null || userpwd == null) {
        TODO("username or passwd null")
    }

    if (username.length > 3 && userpwd.length > 6) {
       if(webServiceLoginAPI(username,userpwd)){
           responseResult("login success",200)
       }
    } else {
        TODO("useranme and password is error")
    }

}

fun webServiceLoginAPI(name:String,pwd:String):Boolean{
    return name == USER_NAME && pwd == PASSWD_VALUE
}
三种方式
loginAPI("aaaa","cccccccccc"){msg:String,code:Int->
        println("message:${msg},code:${code}")

    }


    loginAPI("aaaa","cccccccccc",{
            msg:String,code:Int->
        println("message:${msg},code:${code}")
    })
    
    loginAPI("aaaa","cccccccccc") { msg: String, code: Int ->
        println("message:${msg},code:${code}")
    }

内联

由于会生成多个对象,完成lambda表达式
使用内联之后,相当于C++ 的#define,把对象调用消除,把代码替换到调用处优化效率
如果参数有lambda,尽量用inline,减少对像和函数的空间开辟

函数引用

Lambda 属于函数类型的对像

::函数

函数类型的返回值

fun show(info:String):Boolean{
    println("我是show method;${info}")
    return true
}

fun showMethod(info:String):(String,Int)->String{
    println("我是show method;${info}")
    return { name:String,age:Int->
        "返回匿名函数${name},${age}"
    }
}

fun showMethod2(info:String):String{
    println("我是show method;${info}")
    return "TODO"
}

调用----------
  val method = showMethod("info ing")
    println(method("zhangsan",100))

匿名函数和具名函数

fun showResultImpl(result: String) {
    println("具名函数:${result}")
}

inline fun showPersonInfo(name:String,age:Int,showResult:(String)->Unit){
    var str = "$name is $age in study"
    showResult(str)
}

调用----------

 val method = showMethod("info ing")
    println(method("zhangsan",100))

    showPersonInfo("lisi",99){
        println(it)
    }
    showPersonInfo("wangwu",444,::showResultImpl)
上一篇下一篇

猜你喜欢

热点阅读