Kotlin Lambda 表达式详解参考来源Kotlin——高级篇一Lambda表达式详解一、Lambda 介绍Lambda 表达式本质是匿名函数底层通过匿名函数实现。它是函数式编程的基础能让代码更简洁。直观对比Android 点击事件// Java 风格匿名内部类mBtn.setOnClickListener(object:View.OnClickListener{overridefunonClick(v:View?){Toast.makeText(this,onClick,Toast.LENGTH_SHORT).show()}})// Kotlin Lambda 风格mBtn.setOnClickListener{Toast.makeText(this,onClick,Toast.LENGTH_SHORT).show()}二、Lambda 使用2.1 Lambda 表达式的特点总是被大括号{}括着参数如果存在在-之前声明参数类型可省略函数体如果存在在-之后2.2 Lambda 语法语法 1无参数val/var变量名{操作的代码}示例// 普通函数funtest(){println(无参数)}// Lambdavaltest{println(无参数)}// 调用test()// 输出无参数语法 2有参数// 完整写法val/var变量名:(参数类型,参数类型,...)-返回值类型{参数1,参数2,...-操作代码}// 简写返回值类型自动推导val/var变量名{参数1:类型,参数2:类型,...-操作代码}示例// 普通函数funtest(a:Int,b:Int):Int{returnab}// Lambda 完整写法valtest:(Int,Int)-Int{a,b-ab}// Lambda 简写valtest{a:Int,b:Int-ab}// 调用test(3,5)// 结果8语法 3作为函数参数funtest(a:Int,参数名:(参数1:类型,参数2:类型,...)-返回类型){...}示例// 普通函数调用funtest(a:Int,b:Int):Intabfunsum(num1:Int,num2:Int):Intnum1num2test(10,sum(3,5))// 结果18// Lambda 作为参数funtest(a:Int,b:(num1:Int,num2:Int)-Int):Int{returnab.invoke(3,5)}// 调用test(10,{num1:Int,num2:Int-num1num2})// 结果18说明invoke()用于通过函数变量调用自身。变量b是一个匿名函数。2.3 语法总结Lambda 总是被大括号括着完整写法有参数类型标注和返回值类型省略类型时返回值类型由-后最后一行表达式自动推导当 Lambda 作为高阶函数参数时只需提供参数类型与返回类型调用时写出具体实现三、Lambda 实践3.1 it —— 单参数的隐式名称it不是关键字而是 Kotlin 对只有一个参数的 Lambda 的约定名称。// it 可作为普通变量名valit:Int0// 单参数 Lambda 中使用 itvalarrarrayOf(1,3,5,7,9)println(arr.filter{it5}.component1())// 输出1自定义高阶函数示例funtest(num1:Int,bool:(Int)-Boolean):Int{returnif(bool(num1))num1else0}println(test(10,{it5}))// 输出10println(test(4,{it5}))// 输出03.2 下划线_—— 忽略未使用的参数valmapmapOf(key1tovalue1,key2tovalue2,key3tovalue3)// 需要 key 和 valuemap.forEach{key,value-println($key\t$value)}// 不需要 key用 _ 忽略map.forEach{_,value-println($value)}3.3 匿名函数特点可以明确指定返回值类型但没有函数名。// 常规函数funtest(x:Int,y:Int):Intxy// 匿名函数fun(x:Int,y:Int):Intxy三种写法valtest1fun(x:Int,y:Int)xy// 返回值自动推断valtest2fun(x:Int,y:Int):Intxy// 显式指定返回类型valtest3fun(x:Int,y:Int):Int{// 完整函数体returnxy}println(test1(3,5))// 8println(test2(4,6))// 10println(test3(5,7))// 12匿名函数 vs Lambda 的核心区别维度匿名函数Lambda参数传递总是在小括号内可省略小括号return行为返回自身函数的值返回包含它的函数3.4 带接收者的函数字面值类似于扩展函数允许在 Lambda 内部访问接收者对象的成员。匿名函数作为接收者valiopfunInt.(other:Int):Intthisotherprintln(2.iop(3))// 输出5Lambda 作为接收者需能推断类型classHTML{funbody(){...}}funhtml(init:HTML.()-Unit):HTML{valhtmlHTML()// 创建接收者对象html.init()// 将接收者传给 lambdareturnhtml}html{body()// 直接调用接收者对象的方法}3.5 闭包定义函数中包含函数Lambda、匿名函数、局部函数、对象表达式。语言一等公民支持闭包Java对象❌Kotlin函数和变量✅表现形式 1携带状态funtest(b:Int):()-Int{vara3returnfun():Int{areturnab}}valttest(3)println(t())// 7println(t())// 8println(t())// 9表现形式 2引用并改变外部变量varsum:Int0valarrarrayOf(1,3,5,7,9)arr.filter{it7}.forEach{sumit}println(sum)// 93.6 实战RecyclerView Item 点击事件classTestAdapter(valcontext:Context,valdata:MutableListString):RecyclerView.AdapterTestAdapter.TestViewHolder(){privatevarmListener:((Int,String)-Unit)?nulloverridefunonBindViewHolder(holder:TestViewHolder?,position:Int){holder?.itemView?.setOnClickListener{mListener?.invoke(position,data[position])}}overridefunonCreateViewHolder(parent:ViewGroup?,viewType:Int):TestViewHolder{returnTestViewHolder(View.inflate(context,layoutId,parent))}overridefungetItemCount():Intdata.sizefunsetOnItemClickListener(mListener:(position:Int,item:String)-Unit){this.mListenermListener}innerclassTestViewHolder(itemView:View):RecyclerView.ViewHolder(itemView)}// 调用TestAdapter(this,dataList).setOnItemClickListener{position,item-Toast.makeText(this,$position\t$item,Toast.LENGTH_SHORT).show()}四、函数类型语法写法含义(Int, Int) - Int接收两个 Int返回 Int 的函数类型(String) - Unit接收 String无返回值的函数类型() - Unit无参数无返回值五、Lambda vs 匿名函数 vs 普通函数维度普通函数匿名函数Lambda关键字funfun无函数名✅ 有❌ 无❌ 无参数位置()内()内-前适用场景功能模块复杂逻辑简洁场景返回值显式或推断显式或推断最后一行表达式示例fun add(a: Int, b: Int) a bfun(a: Int, b: Int) a b{ a: Int, b: Int - a b }六、总结Lambda 表达式是 Kotlin 函数式编程的核心提供简洁的匿名函数写法语法结构{ 参数列表 - 函数体 }函数类型(参数类型) - 返回类型适用场景集合操作filter、map、forEach事件回调setOnClickListenerDSL 构建Compose UI核心规则参数类型可省略自动推断单参数可用it指代未使用参数可用_忽略返回值是最后一行表达式的值与匿名函数的区别Lambda 参数可省略小括号匿名函数不行Lambda 的return返回外层函数匿名函数返回自身
企业数字化 ERP 产品动态
相关推荐
如何用 SDR++ 免费收听全频段无线电:软件定义无线电新手完整上手指南 如何用 SDR 免费收听全频段无线电:软件定义无线电新手完整上手指南 【免费下载链接】SDRPlusPlus Cross-Platform SDR Software 项目地址: https://gitcode.com/GitHub_Trending/sd/SDRPlusPlus
SDR(SDR Plus Plus)是一款免费、开源、… · 2026/9/24 14:00:27
RK3588平台开发系列讲解(调试篇)CGroup 精细化的控制 文章目录 一、CPU 与 CGroup 二、限制进程的 CPU 资源占用 三、cpu.shares:多个 cgroup 组的权重划分 四、sched_autogroup 沉淀、分享、成长,让自己和他人都能有所收获!😄 CGroup 的全称是 Control Group,是容器实现环境隔离的两种关键技术之一,它对很多子系统提供精细… · 2026/9/24 14:00:27
swagger-codegen 生成 Java 模型时如何表达多维数组:ArrayTest 模型全解析 开发工具代码生成API设计 【免费下载链接】swagger-codegen swagger-codegen contains a template-driven engine to generate documentation, API clients and server stubs in different languages by parsing your OpenAPI / Swagger definition. 项目地址: http… · 2026/9/24 14:00:27
OpenChamber 1.0.7 更新体验优化:OpenCode CLI 检测与桌面端更新管线解析 AI Agent人工智能代码智能体交互助手 【免费下载链接】openchamber Agentic Development Environment based on OpenCode AI agent 项目地址: https://gitcode.com/gh_mirrors/op/openchamber 点击查看 免费下载 OpenChamber 1.0.7(2025-12-08ÿ… · 2026/9/24 14:27:24
“没结果不计费”的AI招聘外包:企业把招聘成本和风险一起交出去 招人难、招人贵、招来的人留不住,是压在无数企业HR心头的三座大山。对批量用人企业而言,一次大规模招聘往往意味着数十万元渠道投入、数周乃至数月的周期,以及“钱花了、人没到位”的巨大风险。近年来,一种以“结果即服务”为核心… · 2026/9/24 14:27:24
低成本开源方案怎么选?嘉立创EDA与嵌入式工具实战指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 14:27:24
新能源汽车动力蓄电池仿真教学系统技术深度解析:架构、建模与实训全链路实现 在新能源汽车职业教育数字化转型进程中,动力蓄电池实训始终是核心难点环节:实车设备采购与维护成本高昂、高压操作存在固有安全风险、内部结构与工作原理抽象难懂、实训考核与管理数字化程度低,传统实训模式难以兼顾标准化、规模化与教学质量… · 2026/9/24 14:27:24
RT-Thread 微芯 SAM C21 平台 Flash 驱动(HAL Flash)技术详解 操作系统嵌入式物联网嵌入式OSRTOS 【免费下载链接】rt-thread RT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/ 项目地址: https://gitcode.com/gh_mirrors/rt/rt-thread 点击查看 免费下载 本篇技术… · 2026/9/24 14:26:59
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44