芬兰湾的科特林一个强大之处就在于它的扩展函数,巧妙的运用这些扩展函数可以让你写出的代码更加优雅,阅读起来更加流畅、下面总结了在开发中经常用到的一些内联扩展函数。经常有小伙伴搞不懂,运行,应用等等这些函数该怎么用,在哪里用,我的建议是先记住每个函数的功能(无非就是它需要什么参数?返回值是什么?)记住这两点再根据实际开发中的场景慢慢的就能熟练运用了。其实这些函数极其类似,不同的函数可以完成同样的功能,通过下面的实例也能看的出。而在我以往的开发经验中这些函数主要的使用场景有两个,一是非空判断,二是对象的初始化或者本身及方法的频繁调用。
内联和正常函数的区别不在于定义函数的异同点。定义的时候只需要加一个标识,就可以让正常函数变为内联函数。实际两者的区别是在实际执行时的处理机制上。内联是耗用性能低,比正常函数少了压栈和出栈的操作,是一种以空间换时间的方式。当函数体少,以及被频繁调用的函数才适合被定义为内联函数
定义:<代码>有趣& lt; T, R>(接收方:T,布洛克:T ()→):R 代码>
功能:将对象作为函数的参数,在函数内可以通过这指代该对象。返回值为函数的最后一行或返回表达式。
<>强实例:强>
1。在自定义视图中当我们初始化画笔时很多时候我们会写下边的代码
var=油漆涂料() 油漆。颜色=Color.BLACK 油漆。strokeWidth f=1.0 油漆。textSize f=18.0 油漆。isAntiAlias=true
如果使用,那么就可以写成这样
var=油漆涂料() (油漆){ 颜色=Color.BLACK strokeWidth f=1.0 textSize f=18.0 isAntiAlias=true }
省去了油漆。后书写起来感觉会更加自然
2。在声明一些集合的场景比如:
var=mutableListOf<列表;String> () list.add (“1”) list.add (“2”) list.add (3)
使用,可以写成
var=列表(mutableListOf()) { 添加(“1”) 添加(“2”) 添加(“3”) 这 }
开发中还有很多场景可以使用的功能,理解了与的功能也就能够灵活运用了。
takeif
定义:<代码>有趣& lt; T>T。takeIf(谓词:(T)→布尔):t # 63; 代码>
功能:传递一个函数参数,如果函数结果为真的,返回T对象,否则返回零。
实例:使用文件文件时通常会判断文件是否存在,比如
var=文件(“filePath”) 如果(file.exists ()) {//做某事 其他}{ 返回假 }
使用takeif后
var=文件(“filePath”)。takeIf {it.exists()} & # 63;:返回false//做一些
takeUnless
定义:<代码>有趣& lt; T>T。takeUnless(谓词:(T)→布尔):t # 63; 代码>
功能:与takeIf相反,参数函数返回假时返回T对象,否则返回零,这里不再举例。
定义:
(1) <代码>快乐& lt; R>运行(布洛克:()→):R 代码>
(2) <代码>快乐& lt; T, R>T.run(布洛克:t ()→):R 代码>
功能:调用运行函数返回值为函数体最后一行,或返回表达式。
<>强实例:强>
返回最后一行
kotlin.run { println(“十一”) println (22) }
结果:
I/系统。11:
I/系统。:22
返回返回表达式,返回后面的代码不再执行(注意写法@run)
kotlin.run { return@run println(“十一”) println (22) }
结果:
I/系统。11:
定义:<代码>有趣的重复(时间:Int,行动:(Int)→代码单元)>
功能:重复执行行动函数*次*从0开始
实例:与循环功能类似,例如
重复(5){println(计数:美元)}
等价于
(我在0 . . 4){println(数:$ i)}
或者