Kotlin探究之旅-基础篇三

前两篇主要讲了一些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探究之旅的中级篇。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180831G028V400?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券