温州网站建设温州网站制作,数据采集发布 wordpress,网站建设公司如何找客户,iis v6 新建网站文章目录 1. 概念介绍2. 使用方法2.1 函数类型的变量2.2 高阶函数 3. 内容总结4.经验分享 我们在上一章回中介绍了Jetpack中Icon和Imamg相关的内容#xff0c;本章回中主要介绍Kotlin中的
lambda、匿名函数和闭包。闲话休提#xff0c;让我们一起Talk Android Jetpack吧本章回中主要介绍Kotlin中的
lambda、匿名函数和闭包。闲话休提让我们一起Talk Android Jetpack吧 1. 概念介绍
关于lambda的概念比较抽象我们通过它的特征来描述它的概念由花括号包裹并且有箭头特征的表达式就是lambda,花括号是整个lambda的内容箭头前的内容是它的参数箭头后的内容是它的实现内容。
和lambda比较类似是的匿名函数和闭包匿名函数就是没有函数名的函数lambda也没有名称因此它们十分相似只有在函数有返回值的时候它们才不同匿名函数有明确的return语句而lambda表达式没有明确的返回语句它通常把实现内容中最后一个表达式的值当作返回值。
闭包比较好理解位于花括号中的内容就是闭包。虽然lambda也位于花括号内但是它只是闭包的一部分闭包中包含的内容不只是lambda,因此可以把lamdba看作是闭包的子集。
明白这些概念后我们通过具体的代码来演示它的使用方法。
2. 使用方法
2.1 函数类型的变量
//变量类型是函数使用匿名函数来赋值
var funValue:()-String fun():String{return this is a function}
//变量类型是函数使用lambda来赋值
var funValue0:()-String {this is a function}
//变量类型是函数使用匿名函数来赋值,省略变量类型
var funValue1 fun():String { return this is a function}
//变量类型是函数使用lambda赋值,省略变量类型
var funValue11 {this is a function}
//只有一行语句时花括号也可以省略
var funValue111 this is a function上面的示例代码中我们定义了变量funValueXXX为了区分不同的变量名称在尾部添加了多个数字,它的类型是函数类型我们先使用匿名函数给它赋值然后再使用lambda表达式给它赋值这样可以区分开匿名函数和lambda表达式的差异。
从代码中可以看到匿名函数的特点有关键字fun和return.相比之下lambda就可以省略这些关键字甚至连大括号也可以省略。接下来我再演示一个复杂一些函数类型。
//变量类型是函数函数有参数但是无返回值使用匿名函数来赋值,这做做法也叫类型实例化
var funValue2:(values:Int)-Unit fun (values:Int){ this is a function,param:$values}
//变量类型是函数函数有参数但是无返回值使用匿lambda来赋值,这做做法也叫类型实例化
var funValue21:(values:Int)-Unit {values - this is a function,param:$values}
//变量类型是函数函数有参数和返回值使用匿名函数来赋值
var funValue31:(values:Int)-String fun(values):String {return this is a function,param:$values}
//变量类型是函数函数有参数和返回值使用lambda来赋值
var funValue32:(values:Int)-String {values - this is a function,param:$values}
//变量类型是函数使用lambda来赋值,省略了参数只有一个参数时使用it代替参数,it是单个参数的隐式名称
var funValue33:(values:Int)-String { this is a function,param:$it}上面的示例代码中我们定义了变量funValueXXX为了区分不同的变量名称在尾部添加了多个数字,它的类型是函数类型这个函数带有参数而且分有返回值和无返回值的两种情况。我们先使用匿名函数给它赋值然后再使用lambda表达式给它赋值这样可以区分开匿名函数和lambda表达式的差异。
从代码中可以看到当函数类型中包含返回值时匿名函数的内容比lambda多lambda显得相对简洁一些。当函数类型中带有参数时lambda表达式显得更加简洁。
看了这么多示例可以得出lambda表达式最大的特征就是有箭头。此外lambda表达式还有一个语法就是省略参数使用it来代替参数。这个语法在compose中经常使用。
2.2 高阶函数
高阶函数就是函数的参数或者返回值的类型是其它函数相当于把函数当作变量传递给高阶函数的参数或者当作高阶函数的返回值。下面是我们通过示例代码来演示
//高阶函数:函数的参数或者返回值是其它的函数相当把函数当作数值来使用
fun inFun(name:String,age: Int):String {return nameage
}
//只有一行语句时可以省略大括号和return
fun inFun1(name:String,age: Int):String nameage
//返回类型可以通过类型推导出来也可以省略
fun inFun2(name:String,age: Int) nameage//函数的第二个参数是函数类型
fun outFun(id:Int,type:(s:String,a:Int)-String):String {val age (1..10).random()println(inFun(Sam ,age))println(id: $id, type: $type)return age $age
}//通过函数引用把命名函数具名函数inFun1当作参数传递给outFun函数
var res outFun(3, ::inFun1)
//把匿名函数当作参数传递给outFun函数,注意关键字fun不能省略
var res1 outFun(33,fun(s:String,a:Int):String{return str $s ,$a})//使用lambda表达式代替匿名函数把lambda表达式传递给outFun函数
//注意lambda必须使用花括号包起来箭头前是参数箭头后是函数体
//注意匿名函数的return不能省略lambda的可以省略而且通常是最后一个表达式的值
var res2 outFun(33,{s:String,a:Int-str $s ,$a})
//省略lambda表达式中的参数类型返回类型return关键字
var res3 outFun(33,{s,a-str $s ,$a})
//函数的最后一参数是lambda时可以将其移动到括号外面(这叫尾lambda)
var res4 outFun(33){s,a-str $s ,$a}上面的示例代码中包含高阶函数该函数的参数是函数类型从示例代码中可以看到使用lambda表达式传递参数比匿名函数传递参数的代码要简洁一些。代码中介绍了函数的两种语法
通过等号来实现简单函数体进而省花括号和return关键字通过函数引用(两个冒号)来传递命名函数给高阶函数
代码中还介绍一种尾lambda的语法当lambda是高阶函数的最后一个参数时可以将它移动到高阶函数的外面也就是花括号中。这个语法在compose中十分常见。
3. 内容总结
最后我们对本章回中的内容做一个总结
lambda和匿名函数十分类似它们都可以用来给函数类型的变量赋值或者和高阶函数一起使用与lambda表达式类似还有闭包它的范围比较广lambda只是它的一个子集匿名函数的特征就是没有函数名但是有fun和return关键字lambda表达式的特征就是有箭头和花括号在大部分场景下lambda的语法更加简洁
4.经验分享
关于lambda表达式和匿名函数的语法大家普通的反应就是看不懂代码。这就是代码简洁与代码易懂之间的茅盾我在开始看这类代码时也有同样的感觉我的经验就是尽量让代码保持简洁如果感觉读不懂代码那么多动手练习一下就可以掌握这种难理解的语法。比如上面的示例代码都是我自己对匿名函数和lambda表达式的理解多写一些就会明白其中的原理到时候就能读懂代码了。
此外还有一些特殊的语法只能是硬记语法规则这个没有任何窍门好在特殊内容比较少比如前面小节中介绍的尾lambda和it。
我最开始看这类代码是在Java中还记得给Button添加监听器(setOnClickListener)就是使用匿名函数刚开始不理解但是写多了就养成了习惯反而觉得这种写法十分方便。我把这个学习经验从Java迁移到了Kotlin中在此分享给大家希望对大家有帮助。
看官们关于Kotlin中的lambda、匿名函数和闭包就介绍到这里欢迎大家在评论区交流与讨论