前两篇主要讲了一些kotlin的基础语法,这篇作为kotlin基础篇三部曲的最后一篇,主要讲一些kotlin的高级函数和内联函数
高阶函数
高阶函数之--lambda表达式
做过java开发的人都知道,lambda表达式在平时开发中的优越性。
不仅简化了匿名内部类的使用,极大的减少代码冗余,写出的代码更简洁,优雅,而且改善了代码的可读性,这对有极强的coding风格的小伙伴来说,简直就是最爱有木有啊!
不过,在lambda表达式,只支持单抽象方法模型,也就是说设计的接口里面只有一个抽象的方法,才符合lambda表达式的规则,多个回调方法不支持。
正所谓工欲善其事必先利其器,可能许多同学对lambda还不是很熟悉,下面先带大家熟悉熟悉lambda的语法。
lambda表达式的一般语法
当lambda表达式的参数个数只有一个,可以省略小括号。
当lambda表达式只包含一条语句时,可以省略大括号、return和语句结尾的分号。
上面简单的描述了一下lambda的语法,下面就让我们一起看看lambda在平时编码过程中的使用。
在java中
而在kotlin中,则可以直接写成lambda的形式。
第一篇有说过,,因此,你想写成普通的方式也是可以的,如下:
将上面代码转换成lambda是这样的
当然也可以直接省略Data,借助kotlin强大的智能类型来推导,就变成了下面这样。
如果以一个闭包作为参数,那么这个闭包也可以拿到括号位面,还可以写成下面这样。
在函数只有一个参数的情况下,圆括号也可以省略,那么,就写成了下面这样。
内联函数
使用高阶函数带来了相应的运行时麻烦:每个函数都是一个对象,它捕获闭包,即这些变量可以在函数体内被访问。内存的分配,虚拟调用的运行都会带来开销。
但在大多数这种开销是可以通过内联文本函数避免。
1、适用于run函数的任何场景,一般用于初始化一个对象实例的时候,操作对象属性,并最终返回这个对象。
2、动态inflate出一个XML的View的时候需要给View绑定数据也会用到。
3、一般可用于多个扩展函数链式调用。
4、数据model多层级包裹判空处理的问题。
apply函数的kotlin和Java转化
let扩展函数的实际上是一个作用域函数,当你需要去定义一个变量在一个特定的作用域范围内,let函数的是一个不错的选择;
简单点可以写成这样
另一种用途 判断object为null的操作
下面以一个小例子来看看let的使用
with函数和前面的几个函数使用方式略有不同,因为它不是以扩展的形式存在的。。
在函数块内可以通过 this 指代该对象。返回值为函数块的最后一行或指定return表达式。
废话不多说,直接上例子,在recycleview的适配时。
java中不使用with
kotlin中使用后,也可以是这样的
适用于let函数的任何场景,also函数和let很像。
只是唯一的不同点就是let函数最后的返回值是最后一行的返回值而also函数的返回值是返回当前的这个对象。
依旧以代码来解释
,准确来说它弥补了let函数在函数体内必须使用it参数替代对象,在run函数中可以像with函数一样可以省略,直接访问实例的公有属性和方法,另一方面它弥补了with函数传入对象判空问题,在run函数中可以像let函数一样做判空处理。
用代码解释
而使用run优化之后,则是这样的
至此,kotlin的lambda函数和内联函数就讲的差不多了,kotlin探究之旅基础篇也将结束了,后面会讲到kotlin探究之旅的中级篇。
领取专属 10元无门槛券
私享最新 技术干货