当前位置: 首页 > news >正文

Kotlin -> Kotlin Lambda 表达式与 Function 接口的关系

1. 基本对应关系

// Lambda 表达式 -> 编译后的 Function 接口
val lambda0: () -> String = { "hello" }                    
// Function0<String>
val lambda1: (Int) -> String = { it.toString() }           
// Function1<Int, String>  
val lambda2: (Int, String) -> Boolean = { i, s -> i > 0 }  
// Function2<Int, String, Boolean>
// ... 最多到 Function22

2. 编译器生成的实现类

val lambda: (Int) -> String = { it.toString() }// 编译器生成类似这样的代码:class Lambda$1 : Function1<Int, String> {override fun invoke(p1: Int): String {return p1.toString()}
}

3. 挂起 Lambda 的特殊情况

// 普通 Lambda
val normalLambda: (Int) -> String = { it.toString() }
// 实现: Function1<Int, String>/
/ 挂起 Lambda  
val suspendLambda: suspend (Int) -> String = { it.toString() }
// 实现: SuspendFunction1<Int, String> + Function2<Int, Continuation<String>, Any?>

4. Function 接口的层次结构

// Kotlin 标准库中的定义
interface Function<out R>interface Function0<out R> : Function<R> {operator fun invoke(): R
}interface Function1<in P1, out R> : Function<R> {operator fun invoke(p1: P1): R
}interface Function2<in P1, in P2, out R> : Function<R> {operator fun invoke(p1: P1, p2: P2): R
}

5. 挂起函数的 Function 接口

// 挂起函数接口
interface SuspendFunction0<out R> : Function<R>
interface SuspendFunction1<in P1, out R> : Function<R>// 但实际编译后实现的是:
// SuspendFunction1 -> Function2<P1, Continuation<R>, Any?>

6. 实际编译示例

// 源码
val add: (Int, Int) -> Int = { a, b -> a + b }// 编译后等价于
val add = object : Function2<Int, Int, Int> {override fun invoke(p1: Int, p2: Int): Int {return p1 + p2}
}

7. 挂起 Lambda 的完整编译

// 源码
val suspendAdd: suspend (Int, Int) -> Int = { a, b -> delay(100)a + b 
}// 编译后类似
class SuspendLambda$1 : SuspendLambda(2), Function3<Int, Int, Continuation<Int>, Any?> {override fun invoke(p1: Int, p2: Int, continuation: Continuation<Int>): Any? {return create(p1, p2, continuation).invokeSuspend(Result.success(Unit))}override fun invokeSuspend(result: Result<Any?>): Any? {// 状态机逻辑when (label) {0 -> {label = 1return delay(100, this)}1 -> {return arg1 + arg2  // 捕获的参数}}}
}

8. 核心规律总结

Lambda 类型编译后实现特点
() -> RFunction0无参数
(P1) -> RFunction1<P1, R>单参数
(P1, P2) -> RFunction2<P1, P2, R>双参数
suspend () -> RSuspendLambda + Function1<Continuation, Any?>挂起无参
suspend (P1) -> RSuspendLambda + Function2<P1, Continuation, Any?>挂起单参

10. 关键差异

  • 普通 Lambda
    • 直接实现对应的 FunctionN 接口
    • invoke 方法直接执行逻辑
  • 挂起 Lambda
    • 继承 SuspendLambda(也是 BaseContinuationImpl
    • 实现 FunctionN+1 接口(额外的 Continuation 参数)
    • 包含状态机逻辑处理挂起点
http://www.dtcms.com/a/306622.html

相关文章:

  • EC2 Amazon Linux 快速安装Airbyte (abctl)
  • B 站排名优化:不同领域的差异化实战策略
  • Ubuntu24.04换源方法
  • macOS安装配置Unbound DNS完整指南
  • 地质测绘专业转码容易吗?外业对于转码有帮助吗?
  • WordPress与主流CMS拿Webshell实战
  • NEG指令说明
  • 鸿蒙中相册权限弹窗
  • 单片机电路基础
  • Prompt编写规范指引
  • 一种高维数据可视化的方法:Visualization and Mapping on Arcs (VMA)
  • MySQL的单行函数:
  • uniapp中的$vm
  • Winform 渐变色 调色板
  • 【AI论文】单一领域能否助力其他领域?一项基于数据的、通过强化学习实现多领域推理的研究
  • C#程序员计算器
  • Linux性能分析与内存调试:perf和Valgrind高级使用指南
  • 数据结构(7)单链表算法题OVA
  • Tlias 案例-整体布局(前端)
  • docker镜像加速及国内镜像源
  • cocos打包web - ios设备息屏及前后台切换音频播放问题
  • 美国人工智能行动计划:洞察 AI 发展新路径​​
  • 怎样在 Vue 中定义全局方法?
  • 快速删除Word和WPS文字中的空白行
  • LLM—— 基于 MCP 协议(SSE 模式)的工具调用实践
  • PYTHON从入门到实践-17通过网络API获取数据与可视化
  • Deforum Stable Diffusion,轻松实现AI视频生成自由!
  • Python爬虫04_Requests豆瓣电影爬取
  • 《消息队列学习指南:从 MQ 基础到 SpringAMQP 实践》
  • AI一周事件(2025年7月22日-7月29日)