Kotlin内置函数之takeIf 和 takeUnless

Kotlin 中的 takeIftakeUnless 是标准库提供的两个作用域函数,用于简化条件判断和链式调用场景中的对象处理。以下是它们的核心特性和使用方式:

sql 复制代码
// takeIf 和 takeUnless 功能是相反的
// name.takeIf { true/false }  true:返回name本身,false返回null
// name.takeUnless { true/false }  false:返回name本身,true返回null

1. takeIf 函数

  • 定义 ‌:当对对象调用 takeIf 时,若其满足 Lambda 表达式中的条件(返回 true),则返回对象本身;否则返回 null‌12。

  • 用途‌:适用于对单个对象进行过滤或条件判断后继续操作。

  • 示例‌:

kotlin 复制代码
fun main() {
    val result = checkPermissionAction("Root2", "!@#$")
    // println("欢迎${result}尊贵的用户欢迎登录系统,拥有超级权限")
    if (result != null) {
        println("欢迎${result}尊贵的用户欢迎登录系统,拥有超级权限")
    } else {
        println("你的权限不够")
    }
    // name.takeIf { true/false }
    // true: 直接返回name本身
    // false: 直接放回null

    // 真正的用途
    println(checkPermissionAction2("Root", "!@#$"))

    // 小结:一般大部分情况下,都是 takeIf + 空合并操作符 = 一起使用
}

// 前端
public fun checkPermissionAction(name: String, pwd: String) : String? {
    return name.takeIf { permissionSystem(name, pwd) }
}

// takeIf + 空合并操作符
public fun checkPermissionAction2(name: String, pwd: String) : String {
    return name.takeIf { permissionSystem(name, pwd) } ?: "你的权限不够"
}

// 权限系统
private fun permissionSystem(username: String, userpwd: String) : Boolean {
    return if (username == "Root" && userpwd == "!@#$") true  else false
}

2. takeUnless 函数

  • 定义 ‌:与 takeIf 逻辑相反。当对象满足 Lambda 表达式中的条件(返回 true),则返回 null;否则返回对象本身‌12。

  • 用途‌:适合需要反向条件判断的场景。

  • 示例‌:

kotlin 复制代码
class Manager {
    private var infoValue: String? = null
    fun getInfoValue() /* : String? */ = infoValue
    fun setInfoValue(infoValue: String) {
        this.infoValue = infoValue
    }
}

fun main(){
   val manager = Manager()
//    manager.setInfoValue("AAA")
    // 小结:takeUnless+it.isNullOrBlank() 一起使用,可以验证字符串有没有初始化等功能
    var result = manager.getInfoValue().takeUnless { it.isNullOrBlank() }?: "未经过任何初始化值"
    println(result)
}

3. 核心区别

函数 条件满足时返回值 条件不满足时返回值
‌**takeIf**‌ 对象本身 null
‌**takeUnless**‌ null 对象本身

4. 典型使用场景

  • 链式调用 ‌:简化多步操作中的条件判断,避免临时变量和嵌套 if 语句‌35。

    ini 复制代码
    // 传统 if 语句 vs takeIf
    val result1 = if (user.age == 99) user.process() else null
    val result2 = user.takeIf { it.age == 99 }?.process() // 链式调用更简洁‌:ml-citation{ref="3,8" data="citationList"}
  • 空安全处理 ‌:结合安全调用操作符 ?. 处理可空对象‌46。

    scss 复制代码
    user.takeIf { it.isValid() }?.saveToDatabase()
  • 替代简单条件分支 ‌:直接替代仅需返回对象或 null 的条件逻辑‌27。


5. 注意事项

  • 返回值可空性 ‌:两者均可能返回 null,需配合 ?.?: 处理空值‌46。
  • 性能影响‌:作为内联函数,不会额外增加运行时开销‌28。
  • 代码可读性 ‌:在复杂条件中,可能不如传统 if 语句直观,需权衡使用场景‌38。

通过合理使用 takeIftakeUnless,可显著提升 Kotlin 代码的简洁性和链式调用的流畅性‌

相关推荐
踢球的打工仔4 小时前
PHP面向对象(7)
android·开发语言·php
安卓理事人4 小时前
安卓socket
android
安卓理事人10 小时前
安卓LinkedBlockingQueue消息队列
android
万能的小裴同学11 小时前
Android M3U8视频播放器
android·音视频
q***577412 小时前
MySql的慢查询(慢日志)
android·mysql·adb
JavaNoober12 小时前
Android 前台服务 "Bad Notification" 崩溃机制分析文档
android
城东米粉儿13 小时前
关于ObjectAnimator
android
zhangphil14 小时前
Android渲染线程Render Thread的RenderNode与DisplayList,引用Bitmap及Open GL纹理上传GPU
android
火柴就是我15 小时前
从头写一个自己的app
android·前端·flutter
lichong95116 小时前
XLog debug 开启打印日志,release 关闭打印日志
android·java·前端