当前位置: 首页 > 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.lryc.cn/news/604707.html

相关文章:

  • 深入理解 Kotlin Flow:异步数据流处理的艺术
  • 在线教育场景下AI应用,课程视频智能生成大纲演示
  • Jupyter Notebook 中显示图片、音频、视频的方法汇总
  • Python 使用pandas库实现Excel字典码表对照自动化处理
  • C++:STL中list的使用和模拟实现
  • 《C++二叉搜索树原理剖析:从原理到高效实现教学》
  • CH347使用笔记:CH347作为FPGA下载器的几种方式
  • 大语言模型API付费?
  • 【PZ7020-StarLite 入门级开发板】——FPGA 开发的理想起点,入门与工业场景的双重优选
  • PyTorch API
  • PyTorch 生态四件套:从图片、视频到文本、语音的“开箱即用”实践笔记
  • 汽车电子控制系统开发的整体安全理念
  • 为什么网站需要高防IP?高防IP的优势是什么?
  • 打造高效、安全的期货资管交易平台:开发流程与关键要素解析
  • 企业级应用安全传输:Vue3+Nest.js AES加密方案设计与实现
  • 开发避坑短篇(9):解决升级Vue3后slot attributes废弃警告
  • 从黑箱到理解模型为什么(模型可解释性与特征重要性分析)
  • 力扣54:螺旋矩阵
  • git rebase 操作记录
  • 《Java 程序设计》第 11 章 - 泛型与集合
  • chukonu阅读笔记(2)
  • 【LY88】双系统指南及避坑
  • 阿里云AI代码助手通义灵码开发指导
  • 【读书笔记】设计数据密集型应用 DDIA 第三章:存储与检索
  • OPCap:Object-aware Prompting Captioning
  • PHP/Java/Python实现:如何有效防止恶意文件上传
  • 【Qt开发】信号与槽(三)-> 自定义信号和槽
  • <RT1176系列13>LWIP概念介绍
  • 游戏盾是如何做到免疫攻击的
  • Spring Cloud Gateway Server Web MVC报错“Unsupported transfer encoding: chunked”解决