ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Lambda表达式详解

Lambda表达式详解 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返回外层函数匿名函数返回自身
返回列表