Kotlin学习笔记基础篇二之函数详解

211 阅读4分钟

1、Kotlin匿名函数

// TODO 匿名函数 的类型推断
fun main() {

    //匿名函数 ,类型推断为String
    //: 方式必须指定参数类型和返回类型
    //方法名 = 类型推断返回类型
//    val method : () ->={}

    //推断为String类型返回值
    val method1 = { v1: Double, v2: Float, v3: Int ->
        "v1:$v1,v2:$v2,v3:$v3"

    }

    println(method1(454.5, 351.3f, 99))
    
    val method2 = {
        32421.4f
    }

    //返回类型== Unit
    println(method2())


    val method3 = { number: Int ->
        number
    }
    //(函数):Int ->Int 返回值int 类型
    println(method3(9))
}

需要注意的是函数带()必须指定返回类型

2、Kotlin 函数隐式返回

// TODO 隐式返回
fun main() {

    //第一步 函数输入输出的声明 ()输入 ->输出 这个是声明
    val methodAction: () -> String

    //第二步,对下面函数的实现
    methodAction = {
        val input = 9999
        "$input test1"
        //匿名函数不写return ,最后一行就是返回值
    }
    println(methodAction)
}


//外面的写法与上面的methodAction等价
fun methodAction() :String{
    return "zhangsan"
}

上面可以看到,写在外面的函数可以优化为内部隐式返回

3、Kotlin中的it关键字

// TODO it 关键字
fun main() {

    val methodAction: (Int, Int, Int) -> String = { number1, number2, number3 ->
        val input = 9999
        "$input test1 参数1: $number1,参数二: $number2,参数三:$number3"
        //匿名函数不写return ,最后一行就是返回值

    }
    println(methodAction(1, 2, 3))
    println(methodAction.invoke(1, 2, 3))

    //一个参数自带it,可以省略 it 就相当于是传递进来的参数
    val methodAction2: (String) -> String = { "$it" }
    println(methodAction2("aaa"))

    val methodAction3: (Double) -> String = { "$it test" }
    println(methodAction3(11212.3))

}

//fun methodAction2(it : String) :String {return "$it test"}

Kotlin中匿名参数就一个时,it关键字就省略,其中methodAction2在内部隐式返回相当于外部的写法

4、Kotlin 中lamada

// TODO lamda表达式
fun main() {

    //(Int,Int)->String 匿名函数等价于lamda
    val addResultMethod = { number1: Int, number2: Int ->
        "两数相加的结果是:${number1 + number2}"
    }
    println(addResultMethod(1, 1))

    // lamda 表达式Int lamda 表达式结果 Any
    val weekResultMethod = { number: Int ->
        when (number) {
            1 -> "星期一"
            2 -> "星期二"
            3 -> "星期三"
            4 -> "星期四"
            5 -> "星期五"
            else -> -1
        } //(Int) ->Any

    }

}

匿名函数就相当于是lamda,一个参数时,it关键字被省略

5、Kotlin函数中参数是函数的定义

// TODO 函数中定义参数是函数的函数

const val USER_NAME_SAVE_DB = "test"
const val USER_PWD_SAVE_DB = "123456"
fun main() {

//第一种方式
    loginAPI("Derry", "123456", { msg: String, code: Int ->
        println("登录情况:msg:$msg,code:$code")
    })


//第二种方式
    loginAPI("test", "123456", responseResult = { msg: String, code: Int ->
        println("登录情况:msg:$msg,code:$code")

    })

    // 返回结果不需要走回调接口,lamda就可以表达
    loginAPI("test", "123456") { msg: String, code: Int ->
        println("登录情况:msg:$msg,code:$code")

    }

}

// java 匿名接口回调Kotlin函数作为参数回调
public fun loginAPI(username: String, userpwd: String, responseResult: (String, Int) -> Unit) {
    if (username == null || userpwd == null) {

    }

    if (username.length > 3 && userpwd.length > 3) {
        if (webServiceLoginAPI(username, userpwd)) {
            //做操作
            responseResult("login Success", 200)
        } else {
            responseResult("login error", 400)
        }
    }
}

public fun webServiceLoginAPI(name: String, pwd: String): Boolean {
    if (name == USER_NAME_SAVE_DB && pwd == USER_PWD_SAVE_DB) {
        return true
    } else {
        return false
    }
}

上面可以看到,函数中的参数带有函数,在mian中实现了三种写法

6、Kotlin 之函数内联 inline

此处编译class使用的是上面的登录逻辑代码编译,看一下没有添加内联标记的匿名函数。 注意:内联函数必须在有匿名函数的方法里进行修饰

截图.png

上面代码不使用内联,编译为class之后,会生成Funtion,导致性能损耗

有lamda的方法加上内联之后,就不会造成性能损耗,没有使用lamda不需要内联函数

// java 匿名接口回调Kotlin函数作为参数回调,inline改为内联函数
public inline fun loginAPI(username: String, userpwd: String, responseResult: (String, Int) -> Unit) {
    if (username == null || userpwd == null) {

    }

    if (username.length > 3 && userpwd.length > 3) {
        if (webServiceLoginAPI(username, userpwd)) {
            //做操作
            responseResult("login Success", 200)
        } else {
            responseResult("login error", 400)
        }
    }
}

看下编译的class文件

截图.png

可以看到变量都在main生成,这种就不消耗性能

7、Kotlin中的函数引用::

函数引用就是将普通函数作为函数的参数的类型引用,加::

// TODO 函数引用::

const val USER_NAME_SAVE_DB = "test"
const val USER_PWD_SAVE_DB = "123456"
fun main() {

    //lamda属于函数类型对象,把methodResponseResult 普通函数变成函数类型的引用::
    loginAPI("test", "123456", ::methodResponseResult)

    //可以单独抽出来
    val obj = ::methodResponseResult
    loginAPI("test", "123456", obj)
}

fun methodResponseResult(msg: String, code: Int) {
    println("最终的登录成果是:msg$msg,code:$code")
}


// java 匿名接口回调Kotlin函数作为参数回调
//函数有lamda应该使用内联 相当于C++  #define
public inline fun loginAPI(username: String, userpwd: String, responseResult: (String, Int) -> Unit) {
    if (USER_NAME_SAVE_DB == username && USER_PWD_SAVE_DB == userpwd) {
        responseResult("登录成功", 200)
    } else {
        responseResult("登录失败", 200)
    }
}

8、Kotlin函数类型作为返回类型

一个函数,返回String ,Double,再返回一个函数类型(java无法做到)

// TODO 函数类型作为返回类型

fun main() {
    show("学习Kotlin语言")

    //得到匿名函数后,还可以直接调用
    val method = showMethod("show")

    println(method("test", 27))

}

//返回一个boolean
fun show(info: String): Boolean {
    println("我是show函数 info:$info")
    return true
}

//返回一个String类型
fun show2(info: String): String {
    println("我是show2函数 info:$info")
    return "DDD"
}


//函数返回一个匿名函数
fun showMethod(info: String): (String, Int) -> String {
    println("我是show函数 info:$info")

    //return 一个匿名函数
    return { name: String, age: Int ->
        "我就是匿名函数,name:$name,age:$age"

    }
}

9、Kotlin的匿名函数与具名函数

匿名函数与具名函数区别就是调用一个函数后,返回的函数,可以是匿名,可以有具体名字

// TODO 函数类型作为返回类型

fun main() {

    //匿名函数, it默认省略,是一个参数使用,多个参数需要标记出
    showPersonInfo("lisi", 99, '男', "学习kotlin函数") {
        println("显示结果:$it")
    }
    /*
    showPersonInfo("lisi", 99, '男', "学习kotlin函数") {num,age->
        println("显示结果:$it")
    }
    */

    //具名函数,有具体名字的函数
    showPersonInfo("zhangsan", 26, '男', "学习C++语言", ::showResultImpl)
}

fun showResultImpl(result: String) {
    println("显示结果:$result")
}


inline fun showPersonInfo(name: String, age: Int, sex: Char, study: String, showResult: (String) -> Unit) {
    val str = "name:$name,age:$age,sex:$sex,study:$study"
    showResult(str)
}

Kotlin基础篇三之字符串与内置函数 juejin.cn/post/709984…