📜  Kotlin高阶函数(1)

📅  最后修改于: 2023-12-03 15:02:33.250000             🧑  作者: Mango

Kotlin高阶函数

在 Kotlin 中,函数可以作为另一个函数的参数或返回值。这种函数称为高阶函数。

什么是高阶函数

高阶函数是指可以接受一个或多个函数作为参数,或者返回一个函数的函数。在 Kotlin 中,函数名并不限于字母和数字,也可以使用符号(如+或-)来表示函数名。

fun calculate(x: Int, y: Int, operation: (Int, Int) -> Int): Int {
    return operation(x, y)
}

fun main() {
    val sumResult = calculate(3, 2) { x, y -> x + y }
    println("Sum Result: $sumResult") //输出 5

    val multiplyResult = calculate(3, 2) { x, y -> x * y }
    println("Multiplication Result: $multiplyResult") //输出 6
}

在上面的代码中,我们定义了一个高阶函数 calculate,它接受三个参数:两个 Int 类型的数值和一个函数类型的参数 operation,用于对这两个数进行操作并返回结果。函数类型 operation 接受两个 Int 类型参数,并返回一个 Int 类型的值。

main 函数中,我们传递两个参数给 calculate 函数,并使用 lambda 表达式来实现操作功能。第一个 lambda 表达式实现了加法运算,而第二个 lambda 表达式实现了乘法运算。

内联函数

在 Kotlin 中,高阶函数的调用会涉及到函数对象的创建和调用栈的频繁压栈出栈操作,导致性能不佳。为了避免这种情况,Kotlin 提供了内联函数的特性,将高阶函数展开为调用方代码的一部分。

以下是一个内联函数的例子:

inline fun calculate(x: Int, y: Int, operation: (Int, Int) -> Int): Int {
    return operation(x, y)
}

fun 关键字前面使用 inline 关键字即可将函数标记为内联函数。

使用函数类型作为返回值

在 Kotlin 中,函数可以返回另一个函数。以下是一个接受字符串作为参数并返回以此字符串为前缀的函数的例子:

fun addPrefix(prefix: String): (String) -> String {
    return { str -> prefix + str }
}

fun main() {
    val addPrefixFun = addPrefix("Hello ")
    val result = addPrefixFun("world!")
    println(result) //输出 "Hello world!"
}

addPrefix 函数中,我们返回了一个 lambda 表达式,它接受一个字符串参数,并将前缀和字符串拼接在一起。在 main 函数中,我们调用 addPrefix 函数并将返回的 lambda 表达式赋值给 addPrefixFun 变量,然后使用该变量来添加前缀并输出结果。

使用函数类型作为属性

在 Kotlin 中,函数类型也可以用作属性类型。以下是一个使用函数类型作为属性类型的例子:

val square: (Int) -> Int = { it * it }
fun main() {
    val x = 3
    val result = square(x)
    println(result) //输出 9
}

在上面的例子中,我们定义了一个属性 square,它的属性类型是一个接受一个 Int 参数并返回一个 Int 类型的 lambda 表达式。在 main 函数中,我们使用该 lambda 表达式来计算一个数的平方并输出结果。

使用扩展函数和 Lambda 表达式

在 Kotlin 中,可以使用扩展函数和 lambda 表达式来简化代码。以下是一个使用扩展函数和 lambda 表达式的例子:

fun List<Int>.sumByDouble(selector: (Int) -> Double): Double {
    var sum = 0.0
    for (element in this) {
        sum += selector(element)
    }
    return sum
}

fun main() {
    val numbers = listOf(1, 2, 3)
    val result = numbers.sumByDouble { it.toDouble() }
    println(result) //输出 6.0
}

在上面的代码中,我们定义了一个扩展函数 sumByDouble,它接受一个参数 selector,它是一个函数类型的参数。我们通过 selector 函数将整数转换为双精度值,并将它们相加得到总和。在 main 函数中,我们使用 sumByDouble 函数来计算数字列表中数值的总和。

总之,高阶函数是 Kotlin 的一个强大特性,它可以减少代码重复和提高代码的可读性。在实际编程中,我们可以使用 lambda 表达式和内联函数来优化代码并提高性能。