2022-05-04 Kotlin高阶函数

  • 定义:一个函数以另一个函数作为参数,或返回值的类型是另一个函数。
    • 一个函数类型例子
(String, Int) -> Unit
fun example(func: (String, Int) -> Unit) {
    func("hello", 123)
}
// 这里Unit相当于Java中的void
  • 作用:可以通过参数决定函数的运行逻辑
fun num1AndNum2(num1: Int, num2: Int, operation: (Int, Int) -> Int): Int {
    return operation(num1, num2)
}

fun plus(n1: Int, n2: Int) = n1 + n2
fun minus(n1: Int, n2: Int) = n1 - n2

fun main() {
    val num1 = 90
    val num2 = 80
    println(num1AndNum2(num1, num2, ::plus))
    println(num1AndNum2(num1, num2, ::minus))
    println(num1AndNum2(num1, num2) { n1: Int, n2: Int ->
        n1 * n2
    })
}

  • 小知识:当内部变量和外部变量重名,导致nameshadowed
  • 给函数参数lambda表达式提供上下文
fun main() {
    val list = listOf<String>("apple", "banana", "orange", "grape")
    val result = StringBuilder().fruitBuild {
        append("start eating fruits.\n")
        for (fruit in list) {
            append(fruit)
            append("\n")
        }
        append("ate all fruits")
    }
    println(result)
}

// StringBuilder.()表明函数定义在该类中,拥有该类的上下文
fun StringBuilder.fruitBuild(block: StringBuilder.() -> Unit): StringBuilder {
    block()
    return this
}
  • 内联函数:如果没有inline关键字,则每次调用上面高阶函数的lambda表达式,都会创建一个新的匿名类实例,(调用的时候使用.invoke()函数),造成带来运行时的额外的内存和性能开销。
    • 使用inline关键字后会在编译时代码替换。
    • image.png
  • 指定内联函数
inline fun inlineTest(block1: () -> Unit, noinline block2: () -> Unit) {
}
  • 指定noinline,区别在于
    • 内联的函数类型参数在编译的时候会被代码替换,因此没有正真的参数属性。对比非内敛的函数类型参数,可以传递给其他参数。
    • 内敛函数引用的lambda表达式可以使用return关键字进行函数返回,非内联函数只能进行局部返回。
  • 指定crossinline: 约定不会在内联函数的lambda表达式中使用return关键字。因为内联函数可以进行外层函数的返回,而lambda不行,因此在lambda中调用内联函数就会出现冲突。通过指定crossinline约定避免这个问题。
inline fun runRunnable(crossinline block: () -> Unit) {
    val runnable = Runnable {
        block()
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、高阶函数 1.1、高阶函数的定义 高阶函数的定义:如果一个函数接收另一个函数作为参数,或者返回值的类型是另一个...
    code希必地阅读 10,421评论 4 6
  • 本篇文章主要介绍以下几个知识点:高阶函数内联函数noinline 与 crossinline高阶函数的应用内容参考...
    开心wonderful阅读 7,517评论 3 4
  • kotlin高阶函数也是函数 第一次看到这个词的时候,我以为是什么神奇的东西,以为是系统提供实习特殊功能的函数,或...
    Yapple阅读 4,079评论 0 1
  • 一、高阶函数介绍 在Kotlin中,高阶函数即指:将函数用作一个函数的参数或者返回值的函数。 1.1、将函数用作函...
    贪玩丶阅读 3,273评论 0 0
  • 声明高阶函数 显示声明 函数类型的返回值也可以标记为可空类型: 定义一个函数类型的可空变量 调用作为参数的函数 看...
    蒋扬海阅读 3,720评论 0 0