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

如何在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

创建完之后,你有几种常用的调用方式:

  1. 使用run函数,把接收者传进去:
val result = "Hello World".run(stringLength)
println(result) // 输出11
  1. 直接用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 07:37:46