Kotlin内置函数之let

Kotlin 的 ‌**let‌ 函数是一个常用的‌ 作用域函数‌,主要用于对对象进行‌ 安全操作‌或‌ 链式转换‌。它的核心特点是‌接收一个对象,通过 lambda 表达式处理该对象并返回结果**‌。以下是其核心知识点和典型使用场景:

基本特性

  1. 函数签名‌:
kotlin 复制代码
fun <T, R> T.let(block: (T) -> R): R { 
return block(this)
}
markdown 复制代码
-   是 `T` 的扩展函数,接收一个以 `T` 为参数的 lambda(`(T) -> R`)。
-   ‌返回 lambda 的结果(类型 `R`),而非原对象本身。
  1. 核心用途‌:

    • 空安全操作 ‌:配合 ?. 避免空指针异常。
    • 对象转换‌:将对象处理后返回新结果。
    • 链式调用‌:在链式操作中处理中间结果。

使用示例

示例 1:空安全操作

scss 复制代码
val name: String? = getName()
name?.let { 
    // 仅在 name 非空时执行此块
    println(it.toUpperCase()) // it 是 name 的非空副本
    it.length                 // 返回结果类型为 Int
}

示例 2:对象转换

kotlin 复制代码
val user = User("Alice", 30)
val bio = user.let { 
    "Name: ${it.name}, Age: ${it.age}" // 转换为字符串
}
println(bio) // 输出 "Name: Alice, Age: 30"

示例 3:链式调用

ini 复制代码
val result = listOf(1, 2, 3)
    .filter { it > 1 }
    .let { 
        it.map { num -> num * 2 } // 处理中间集合
    }
// result = [4, 6]

与其他作用域函数的区别

函数 参数形式 返回值 典型场景
let (T) -> R R 空安全、对象转换
apply T.() -> Unit T 对象配置(返回自身)
run T.() -> R R 对象计算(直接访问 this)
also (T) -> Unit T 副作用操作(返回自身)

关键细节

  1. ‌**it 代替对象**‌:在 let 的 lambda 中,原对象通过 it 访问(可重命名)。

    rust 复制代码
    kotlinCopy Code
    user?.let { u -> 
        println(u.name) // 重命名为 u
    }
  2. 空安全优化 ‌:结合 ?.let 避免嵌套 if (obj != null)

  3. 结果导向‌:适用于需要返回新值的场景(如数据转换、计算)。


典型使用场景

  1. 空安全检测‌:

    csharp 复制代码
    kotlinCopy Code
    val length = nullableString?.let { 
        it.trim().length // 仅非空时执行
    } ?: 0 // 配合 Elvis 操作符提供默认值
  2. 替代临时变量‌:

    scss 复制代码
    kotlinCopy Code
    // 原始写法
    val user = getUser()
    println(user.name)
    
    // 使用 let 简化
    getUser()?.let { println(it.name) }
  3. 链式操作中的中间处理‌:

    scss 复制代码
    kotlinCopy Code
    File("data.txt")
        .readText()
        .let { it.trim().split(",") } // 处理读取的文本
        .forEach { println(it) }
  4. 限制变量作用域‌:

    scss 复制代码
    kotlinCopy Code
    val config = loadConfig().let { 
        // 此处处理配置,避免污染外部作用域
        validate(it)
        it.toUpperCase()
    }

性能说明

  • let 是‌内联函数 ‌(inline 关键字),无额外运行时开销。

总结

  • 使用 let 的场景:

    • 需要‌空安全操作 ‌时(?.let)。
    • 将对象‌转换为其他类型‌时。
    • 需要‌链式处理中间结果‌时。
  • 避免 let 的场景:

    • 仅需操作对象本身并返回自身时(用 applyalso)。
    • 需要直接访问 this 时(用 run)。
相关推荐
2501_916008894 小时前
Web 前端开发常用工具推荐与团队实践分享
android·前端·ios·小程序·uni-app·iphone·webview
我科绝伦(Huanhuan Zhou)5 小时前
MySQL一键升级脚本(5.7-8.0)
android·mysql·adb
怪兽20146 小时前
Android View, SurfaceView, GLSurfaceView 的区别
android·面试
龚礼鹏7 小时前
android 图像显示框架二——流程分析
android
消失的旧时光-19437 小时前
kmp需要技能
android·设计模式·kotlin
帅得不敢出门8 小时前
Linux服务器编译android报no space left on device导致失败的定位解决
android·linux·服务器
雨白8 小时前
协程间的通信管道 —— Kotlin Channel 详解
android·kotlin
TimeFine10 小时前
kotlin协程 容易被忽视的CompletableDeferred
android
czhc114007566311 小时前
Linux1023 mysql 修改密码等
android·mysql·adb
GOATLong12 小时前
MySQL内置函数
android·数据库·c++·vscode·mysql