You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin如何声明并调用接收函数列表作为参数的函数?

在Kotlin中传递函数列表作为参数的最佳实践

嘿,既然你已经会传递单个函数作为参数了,那处理函数列表其实就是把单个函数的概念扩展一下就行,超简单!我给你一步步拆解清楚:

1. 先明确函数类型

和单个函数参数一样,你得先确定要传递的函数的类型签名。举几个常见的例子:

  • 无参无返回值的函数:() -> Unit
  • 接受一个Int参数、返回String的函数:(Int) -> String
  • 接受两个String参数、返回Boolean的函数:(String, String) -> Boolean

2. 定义接受函数列表的函数

把确定好的函数类型放到List<>里,作为参数类型就可以了。下面是几个实用的示例:

例子1:执行无参无返回值的函数列表

// 定义函数:接收无参无返回值的函数列表,逐个执行
fun runAllTasks(tasks: List<() -> Unit>) {
    tasks.forEach { task -> task() } // 遍历列表,调用每个函数
}

例子2:给所有函数传入相同参数并收集结果

// 定义函数:接收(Int) -> String的函数列表,将每个函数应用到传入的number上,返回结果列表
fun transformNumber(number: Int, transformers: List<(Int) -> String>): List<String> {
    return transformers.map { transformer -> transformer(number) }
}

3. 调用函数列表参数的函数

调用的时候,你可以传入命名函数、匿名函数或者lambda表达式,只要类型匹配就行:

调用例子1(无参函数列表)

先定义几个命名函数:

fun printMorningGreeting() = println("Good morning!")
fun printAfternoonGreeting() = println("Good afternoon!")
fun printEveningGreeting() = println("Good evening!")

然后调用:

// 传入命名函数的列表
runAllTasks(listOf(printMorningGreeting, printAfternoonGreeting, printEveningGreeting))

// 也可以直接传匿名函数/lambda列表
runAllTasks(listOf(
    { println("First custom task") },
    { println("Second custom task") }
))

调用例子2(带参数的函数列表)

val squareToString = { num: Int -> "Square of $num is ${num * num}" }
val doubleToString = { num: Int -> "Double of $num is ${num * 2}" }
val tripleToString = { num: Int -> "Triple of $num is ${num * 3}" }

val results = transformNumber(7, listOf(squareToString, doubleToString, tripleToString))
println(results) // 输出:[Square of 7 is 49, Double of 7 is 14, Triple of 7 is 21]

4. 可选:用vararg简化调用(无需显式写listOf)

如果你经常需要传递多个函数,但不想每次都写listOf(),可以用vararg关键字,它允许你直接传入多个函数参数,底层会自动转成数组:

// 用vararg定义函数
fun runTasksVararg(vararg tasks: () -> Unit) {
    tasks.forEach { it() } // 数组也可以用forEach遍历
}

// 调用的时候直接传多个函数,不用listOf
runTasksVararg(printMorningGreeting, printAfternoonGreeting, printEveningGreeting)

总结

核心逻辑其实很简单:

  • 先确定单个函数的类型签名
  • 用List<函数类型>作为参数类型(或者用vararg简化调用)
  • 调用时传入匹配类型的函数列表(命名函数、lambda都可以)

内容的提问来源于stack exchange,提问作者James Elkwood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:45:38