博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
kotlin-inline函数
阅读量:7052 次
发布时间:2019-06-28

本文共 1243 字,大约阅读时间需要 4 分钟。

高阶函数是将函数用作参数或返回值的函数。如lambda表达式

1.高阶函数缺点: 使用高阶函数会带来一些运行时的效率损失:每一个函数都是一个对象,并且会捕获一个闭包。 即那些在函数体内会访问到的变量。 内存分配(对于函数对象和类)和虚拟调用会引入运行时间开销。

尤其在循环中,能节省很多开销。

于是,inline诞生:

lock(l) { foo() }复制代码

注:上面的代码,编译器会自动转成,不会生成函数对象

l.lock()try {    foo()}finally {    l.unlock()}复制代码

具体做法:

inline fun 
lock(lock: Lock, body: () -> T): T { …… }复制代码

2.优雅的参数类型写法

如:有时候我们需要访问一个作为参数传给我们的一个类型:

fun TreeNode.findParentOfType(clazz: Class): T? { var p = parent while (p != null && !clazz.isInstance(p)) { p = p.parent } @Suppress("UNCHECKED_CAST") return p as T? } 在这里我们向上遍历一棵树并且检查每个节点是不是特定的类型。 这都没有问题,但是调用处不是很优雅:

treeNode.findParentOfType(MyTreeNode::class.java) 我们真正想要的只是传一个类型给该函数,即像这样调用它:

treeNode.findParentOfType() 为能够这么做,内联函数支持具体化的类型参数,于是我们可以这样写:

inline fun TreeNode.findParentOfType(): T? { var p = parent while (p != null && p !is T) { p = p.parent } return p as T? } 我们使用 reified 修饰符来限定类型参数,现在可以在函数内部访问它了, 几乎就像是一个普通的类一样。由于函数是内联的,不需要反射,正常的操作符如 !is 和 as 现在都能用了。此外,我们还可以按照上面提到的方式调用它:myTree.findParentOfType()。

3.内联属性

val foo: Foo    inline get() = Foo()​var bar: Bar    get() = ……    inline set(v) { …… }你也可以标注整个属性,将它的两个访问器都标记为内联:inline var bar: Bar    get() = ……    set(v) { …… }在调用处,内联访问器如同内联函数一样内联复制代码

转载于:https://juejin.im/post/5cadacc96fb9a068b2296827

你可能感兴趣的文章
MVC验证12-使用DataAnnotationsExtensions对整型、邮件、最小值、文件类型、Url地址等验证...
查看>>
Source not found
查看>>
【CLRS】《算法导论》读书笔记(一):堆排序(Heapsort)
查看>>
支持类型过滤的枚举器
查看>>
HDU 4275 Color the Tree(树同构)
查看>>
php里Array2xml
查看>>
以boost::function和boost:bind取代虚函数
查看>>
oracle监听器(listener)配置心得
查看>>
wince -- RS485半双工实现
查看>>
nginx 源码学习笔记(二)——nginx精粹-模块
查看>>
DirectX截图黑屏的解决办法
查看>>
Expanding Cat5e LAN segments over 100 metres using OUTREACH Ethernet LAN extenders
查看>>
关于Oracle冷备份与热备份的对比
查看>>
C#条件判断-嵌套if结构
查看>>
Selenium:Hello,World!
查看>>
HibernateTemplate 查询
查看>>
ListView控件的基本操作
查看>>
jQuery 参考手册 - 属性操作
查看>>
C–gcc命令行下的参数
查看>>
mysql 连接查询 和 子查询
查看>>