如何在Kotlin中创建带接收者的Lambda?求解String.()->Int类型Lambda创建方法
在Kotlin中创建带接收者的Lambda
嘿,这问题问得特别好!带接收者的Lambda是Kotlin里很实用的特性,尤其是写DSL或者简化扩展逻辑的时候经常用到。我来一步步给你讲清楚怎么弄:
首先,先明确你说的String.() -> Int是什么意思——这是带接收者的函数类型,它表示这个Lambda是运行在String的上下文里的,Lambda内部可以直接访问String的成员,不用把它当成参数传进去。
直接创建带接收者的Lambda
你已经会写普通的(String) -> Int类型Lambda:{ s: String -> s.length },那对应的带接收者版本其实更简洁,直接这样写:
// 显式指定类型,完整写法 val stringLength: String.() -> Int = { this.length } // 因为在接收者上下文里,this可以省略,所以更短: val stringLengthShort: String.() -> Int = { length }
这里的this就指代那个作为接收者的String对象,和你在String的扩展函数里用this是一个意思。
怎么调用带接收者的Lambda
创建完之后,你有几种常用的调用方式:
- 使用
run函数,把接收者传进去:
val result = "Hello World".run(stringLength) println(result) // 输出11
- 直接用
invoke方法,手动传入接收者:
val result = stringLength.invoke("Hello World") println(result) // 输出11
对比普通Lambda和带接收者Lambda的区别
- 普通Lambda:
(String) -> Int,需要把String作为参数传入,Lambda里通过参数名(比如s)访问成员 - 带接收者Lambda:
String.() -> Int,把String作为上下文(接收者),Lambda里直接通过this(可省略)访问成员
进阶:带参数的带接收者Lambda
如果你需要带参数的版本,比如String.(Int) -> Boolean(接收者是String,再传一个Int参数,返回Boolean),写法也类似:
val isLongerThan: String.(Int) -> Boolean = { threshold -> length > threshold } // 只有一个参数时,还可以用it代替参数名: val isLongerThanShort: String.(Int) -> Boolean = { length > it } // 调用方式示例 val result = "Kotlin".run { isLongerThan(3) } // 返回true // 也可以把它转成扩展函数直接调用: fun String.isLongerThan(threshold: Int) = length > threshold val result2 = "Kotlin".isLongerThan(3) // 同样返回true
这样是不是就清楚啦?带接收者的Lambda核心就是把目标类型变成上下文,让你在Lambda里直接操作它的成员,省去了参数传递的麻烦。
内容的提问来源于stack exchange,提问作者user12848156
相关产品推荐
相关产品推荐

