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
相关产品推荐
相关产品推荐

