kotlin 里面的如何处理多个lambda函数参数?

在 Kotlin 中,可以通过以下方式实现函数接收多个 Lambda 表达式 作为参数,其中 Kotlin 中每个 Lambda 参数在底层会被编译为一个 ​**FunctionN 接口的匿名类实例**​(N 表示参数个数)。

其本质是

  1. 编译为函数对象 :每个 Lambda 转换为 FunctionN 接口的实例。
  2. 内存与性能权衡:非内联 Lambda 有对象分配开销,内联 Lambda 通过代码展开消除开销。
  3. 语法糖优化:尾随 Lambda 和命名参数提升多 Lambda 调用的可读性。

1. ​基础示例:直接声明多个 Lambda 参数

kotlin 复制代码
fun runMultipleLambdas(
    action1: () -> Unit,
    action2: (String) -> Int,
    action3: (Int) -> Boolean
) {
    action1()
    val result = action2("test")
    action3(result)
}

// 调用方式(显式命名参数,推荐):
runMultipleLambdas(
    action1 = { println("Action1!") },
    action2 = { s -> s.length },
    action3 = { num -> num > 0 }
)

2. ​利用 Trailing Lambda 语法

如果某个 Lambda 是最后一个参数,可以将其放在括号外:

kotlin 复制代码
fun withTrailingLambda(
    before: () -> Unit,
    after: (String) -> Unit
) {
    before()
    after("Done")
}

// 调用方式:
withTrailingLambda(
    { println("Starting...") }  // before 参数
) { s ->                       // after 参数(Trailing Lambda)
    println("Result: $s")
}

3. ​为 Lambda 参数提供默认值

让某些 Lambda 成为可选参数:

kotlin 复制代码
fun flexibleLambdas(
    mandatory: (Int) -> Unit,
    optional: (String) -> Unit = { _ -> } // 默认空实现
) {
    mandatory(42)
    optional("optional")
}

// 调用方式:
flexibleLambdas({ println(it) }) // 只传必要的 Lambda
flexibleLambdas(
    mandatory = { println("Mandatory: $it") },
    optional = { println("Optional: $it") }
)

4. ​使用高阶函数处理多个 Lambda

结合 invoke 调用或其他逻辑:

kotlin 复制代码
fun processData(
    data: List<Int>,
    onEven: (Int) -> Unit,
    onOdd: (Int) -> Unit
) {
    data.forEach {
        if (it % 2 == 0) onEven(it) else onOdd(it)
    }
}

// 调用方式:
processData(listOf(1, 2, 3),
    onEven = { println("Even: $it") },
    onOdd = { println("Odd: $it") }
)

5. ​通过类型别名提升可读性

为复杂的 Lambda 类型定义别名:

kotlin 复制代码
typealias Parser<T> = (String) -> T?
typealias Logger = (String) -> Unit

// 由于parseInput返回的Int,因此parser参数对应的是 Parser<Int>,
// 如果函数返回值是泛型,则可以灵活写成 parser: Parser<T>
fun parseInput(
    input: String,
    parser: Parser<Int>,
    log: Logger = { println(it) }
): Int? {
    log("Parsing: $input")
    return parser(input)
}

// 调用方式:
val result = parseInput("123", { it.toIntOrNull() })

关键注意事项:

  • 参数顺序:调用时需按顺序传递,或使用命名参数明确指定。
  • 可读性:多个 Lambda 建议换行并命名参数,避免歧义。
  • 性能 :Lambda 在 JVM 上会生成匿名类,频繁调用可考虑内联(inline 关键字)。

通过上述方法,可以灵活地在 Kotlin 函数中传递和处理多个 Lambda 表达式。

相关推荐
2501_9151063212 分钟前
常见 iOS 抓包工具的使用方式与组合思路
android·ios·小程序·https·uni-app·iphone·webview
鹏程十八少24 分钟前
1.Android 3分钟跑通腾讯 Shadow 插件化官方Demo:零反射、手把手实战(基于源码依赖)
android·前端·面试
似霰24 分钟前
HIDL Hal 开发笔记8----添加硬件访问服务
android·framework·hal
SY_FC29 分钟前
niapp开发的 H5 被app嵌套,H5调用ios和安卓方法
android·ios·cocoa
假装我不帅32 分钟前
rider开发asp.net webform项目
android·okhttp·asp.net
元媛媛41 分钟前
UiPath |5个基础自动化场景
android·java·自动化
未来之窗软件服务43 分钟前
幽冥大陆(九十七)分词服务训练源码dic生成 —东方仙盟练气期
android
Kapaseker1 小时前
千锤百炼写View 摸爬滚打名声就
android·kotlin
虫小宝1 小时前
微信群发消息API接口对接中Java后端的请求参数校验与异常反馈优化技巧
android·java·开发语言
三少爷的鞋1 小时前
架构避坑:为什么 UseCase 不该启动协程,也不该切线程?
android