kotlin内联函数——takeIf和takeUnless

1.takeIf

当对一个对象调用takeIf时,如果对象满足给定的判断条件,则返回该对象;否则,返回null。因此,takeIf是对单个对象进行过滤的函数。例如,

class User {
            var name: String? = null
            var age = 99
            fun set(ageParam: Int) {
                age = ageParam
            }

            fun get(): Int {
                return age
            }
        }     


 val user = User().takeIf {
            it.age == 99
        }
Log.d(TAG,"user对象:$user")

2.takeUnless

takeUnless的逻辑与takeIf相反。当对一个对象调用takeUnless时,如果对象满足给定的判断条件,则返回null;否则,返回该对象。例如,

class User {
            var name: String? = null
            var age = 99
            fun set(ageParam: Int) {
                age = ageParam
            }

            fun get(): Int {
                return age
            }
        }  


val user = User().takeUnless {
            it.age == 999
        }
Log.d(TAG,"user对象:$user")

注意:在takeIf和takeUnless函数调用后,如还有其他调用,请在调用时用?.判空。因为两者返回的对象可能为null。例如,

class User {
            var name: String? = null
            var age = 99
            fun set(ageParam: Int) {
                age = ageParam
            }

            fun get(): Int {
                return age
            }
        }  


Log.d(TAG, "User#age:${
                User().takeUnless {
                    it.age == 999
                }?.age
            }"
        )

推荐文章

Scope functions | Kotlin Documentation

### Kotlin 内联函数与非内联函数的区别及用法 #### 定义与基本概念 在 Kotlin 中,`inline` 函数是一种优化机制,用于减少因高阶函数调用带来的性能开销。当声明一个 `inline` 函数时,在编译阶段会将其函数体直接嵌入到调用处,而不是像普通函数那样通过栈帧来执行调用[^1]。 相比之下,普通的非内联函数会在运行时动态分配内存并跳转至其定义位置执行逻辑。这种方式虽然简单直观,但在频繁调用或者涉及大量闭包的情况下可能会引入额外的性能损耗。 #### 性能影响 由于内联操作实际上是在编译期展开整个方法实现,因此可以有效避免创建匿名类实例以及相关的对象构造成本。然而这也意味着最终生成的目标字节码体积可能增大,因为每个调用点都会复制一份完整的代码副本。 对于那些只被少量调用或是非常短小精悍的功能模块来说,采用常规形式往往更加合适;而对于需要高度重复利用且计算密集型的任务,则推荐考虑使用 `inline` 关键字修饰的方法以提升效率表现。 #### 使用场景对比分析 以下是两种类型的典型应用场景: - **Inline Functions**: 当涉及到Lambda表达式的传递参数,并希望消除这些lambda所带来的潜在性能问题(如增加堆上新对象的数量),此时应该优先选用带有 `inline` 的版本。 ```kotlin inline fun operation(crossinline action: () -> Unit){ val thread = Thread { try{ action() } finally { println("Finally block executed.") } } thread.start() thread.join() } // Usage Example: operation { println("Performing some task...") } ``` - **Non-Inlined Functions**: 如果某个特定功能不需要特别关注于上述提到的那种细微差别之处——即它既不会显著受益也不会受到损害由inlining引起的变化的话,那么维持现状即可满足需求。 ```kotlin fun simpleOperation(action: () -> Unit){ action() } // Usage Example: simpleOperation{ println("Executing an action.") } ``` 值得注意的是,在某些特殊情况下(例如反射),即使标记为了 `inline`, 实际行为也可能有所不同甚至完全失效。 #### 结论 综上所述,开发者应当根据实际项目中的具体情况权衡利弊后再决定是否应用 `inline` 特性。尽管它可以带来一定的速度改进,但也可能导致程序大小膨胀等问题发生。所以务必谨慎评估每种情况下的取舍关系。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闲暇部落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值