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 的场景:

    • 仅需操作对象本身并返回自身时(用 apply 或 also)。
    • 需要直接访问 this 时(用 run)。
相关推荐
9624561 小时前
从“一键创建 ECS”到完整恢复状态机:ACK 抢占式节点恢复 Android 工具升级复盘
android
LCD液晶屏4 小时前
京瓷液晶屏停产替代:杭州立煌科技工业 LCD 解决方案
android·科技
2501_932750266 小时前
Android 自定义 View 入门
android
事圆则缓8 小时前
Android 开启线程的几种方式:Thread、线程池、HandlerThread 与协程
android
半摆烂日常1 天前
低代码平台API对接实践:接口鉴权与数据同步的完整实现
android·低代码·rxjava
事圆则缓1 天前
volatile 使用场景全解析:它能保证什么,又解决不了什么
android
蒲公英内测分发1 天前
智能投影仪参加海外展会,未上架的 Android 配套 App 怎么让客户限时试用?
android
ii_best1 天前
按键精灵手机端开发安卓版实战:手写一个可最小化、可拖动的「运行日志悬浮窗」(附完整 源码 + 踩坑记录)
android·ios·智能手机·自动化·ai编程·按键精灵
终端安全笔记1 天前
安卓做 MDM 管控,先分清三种注册入口
android·安全·智能手机
乌萨达1 天前
手机模拟器安卓怎么用?电脑安装应用、玩手游与账号同步指南
android·智能手机·电脑·雷电模拟器