Kotlin中Lambda表达式(->)使用疑问:test0函数的combine参数正确传递方法
解决Kotlin中Lambda参数传递的类型不匹配问题
你遇到的问题核心是混淆了「函数引用」和「函数执行结果」:
当你写getFold(a)时,你是直接调用了getFold函数并传入a,得到的是一个String类型的返回值;但test0的combine参数需要的是一个函数类型(String) -> String——也就是一个能接收String参数、返回String的函数本身,而不是函数执行后的结果。
下面给你几种正确的传递方式:
方式1:传递函数引用
因为你的getFold函数签名完全符合(String) -> String的要求(接收一个String,返回String),所以可以用Kotlin的::操作符获取函数引用,直接传递给combine:
private fun getFold(a: String): String { return a } fun test() { val a = "a" val test1 = test0(a, combine = ::getFold) }
方式2:直接使用Lambda表达式
如果不需要单独定义getFold函数,也可以直接在调用test0时写Lambda表达式,这也是Kotlin中最常用的方式:
fun test() { val a = "a" // 完整写法 val test1 = test0(a) { input -> input } // 简化写法(当Lambda只有一个参数时,可以用it代替参数名) val test2 = test0(a) { it } }
额外说明
如果你的getFold需要额外的参数(比如不是只接收一个String),还可以用闭包捕获外部变量,适配成目标函数类型:
private fun getFold(prefix: String, a: String): String { return "$prefix$a" } fun test() { val a = "a" val prefix = "prefix_" // 用Lambda捕获prefix,将多参数函数适配成(String)->String的类型 val test1 = test0(a) { input -> getFold(prefix, input) } }
内容的提问来源于stack exchange,提问作者Matrix
相关产品推荐
相关产品推荐

