如何在Kotlin中定义接收vararg参数的Lambda函数?
解决Kotlin中定义接收vararg参数的Lambda函数问题
哎,这个坑我之前踩过!你遇到的编译错误是因为Kotlin的函数类型语法本身不支持在参数里直接使用vararg修饰符,不过有两种简单的办法能实现你想要的调用效果:
方法一:用匿名函数替代Lambda
这是最直接的方案,因为匿名函数允许使用vararg参数,而且调用方式完全符合你的预期:
val f = fun(vararg strings: String) { for (str in strings) println(str) } // 直接调用,和你想要的一样 f("a", "b", "c")
匿名函数的语法天生支持vararg修饰符,完美绕过了函数类型不支持的限制,调用起来也不需要额外的语法糖,和你最初的预期完全匹配。
方法二:用数组参数+展开运算符(Lambda形式)
如果你坚持要使用Lambda表达式,可以把参数定义为数组类型,调用时用*展开数组:
val f: (Array<String>) -> Unit = { arr -> arr.forEach { println(it) } } // 调用时需要用*展开数组 f(*arrayOf("a", "b", "c"))
这种方式能保留Lambda的写法,但调用时需要手动创建数组并展开,不如第一种方法简洁。
为什么原来的写法不行?
Kotlin的函数类型(比如(vararg String) -> Unit)的语法规范里,vararg是不允许出现在函数类型的参数列表中的,这是语言层面的明确限制,所以直接在Lambda的函数类型里加vararg会触发编译错误。
内容的提问来源于stack exchange,提问作者David Soroko
相关产品推荐
相关产品推荐

