kotlin 高阶函数

发布时间 2023-11-11 15:13:38作者: LCAC

一、定义:以另一个函数作为参数或者返回值的函数

1、kotlin中,函数以lambda或者函数引用来表示

 

二、函数类型

1、如下是函数的类型

上述声明了函数的类型,括号内包含了该函数类型需要传入的参数类型,紧接着箭头,最后是返回的类型(在声明函数类型时候,返回类型即使是Unit也不可以省略)

2、函数的声明

val sum: (Int, Int) -> Int = {x, y -> x + y} // 声明sum是一个函数类型,该函数类型是:(Int, Int) -> Int ,右边对应的函数体的参数分别为x和y, 这里不用给x和y声明类型是因为在声明sum类型的时候已经指明了参数都是Int
val sum = {x: Int, y: Int -> x + y} // 左边只有sum,具体的函数类型则需要通过等号右边的函数来推导。函数体的参数x和y均指明了类型是因为如果不指明类型则无法从其他任何地方推导出他们的类型,x + y 是一个表达式,在kotlin表达式均有返回值x + y的返回值也是Int所以,sum整体推导出的类型是:(Int, Int) -> Int
val sum = {x: Int, y: Int -> println(x + y)} // 同上面,但是因为println(x + y) 返回的为Unit 所以sum推导出的类型是: (Int, Int) -> Unit
inc: (Int) -> Int = {it + 1} // 该函数和上面的类似,这里主要说明的是函数体没有显示声明参数,并且有一个it; 在kotlin的lambda这里,如果参数只有一个则可以省略,并将该参数命名为it, 所以上面和这个是等价的:val inc: (Int) -> Int = {x -> x + 1}

 

三、lambda函数类型的注意地方

1、本身不能有return语句,对于返回的值以lambda函数中的最后一句执行的表达式的值作为返回值

2、函数中,lambda作为函数的最后一个参数则可以写在函数的外面进行传入

fun <T> Collection<T>.joinToString(
    sep: String = ", ",
    prefix: String = "",
    suffix: String = "",
    transform: (T) -> String = {it.toString()} // transform是joinToString的最后一个参数
): String {
    val result = java.lang.StringBuilder(prefix)
    for ((index, element) in this.withIndex()) {
        if (index > 0) result.append(sep)
        result.append(transform(element))
    }
    result.append(suffix)
    return result.toString()
}

val letters = listOf("Alpha", "Beta")

我们正常在调用的时候,可以是:

letters.joinToString(sep = "! ", suffix = ")", transform = {it.uppercase()})

如上是咱们正常的调用方式,但是这里transform在函数的最后一个参数,如下的这种方式也是合法的

    letters.joinToString(sep = "! ", suffix = ")") {
        it.uppercase()
    }

如上写在圆括号的外面,并且当圆括号内不不传参数的时候,甚至连圆括号都可以省略

    letters.joinToString { 
        it.lowercase()
    }

 

3、上面第二点的transform函数能够作为参数传入,那么同理也能够作为返回值传出,传出的返回值函数也能够捕获函数内不的临时变量,具体可见:https://www.cnblogs.com/czwlinux/p/17799511.html的第四点:捕捉作用域中的变量