首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Kotlin 作用域函数(let、run、with、apply、also)的使用指南

  • 25-04-16 14:00
  • 4091
  • 12094
juejin.cn

在 Kotlin 中,作用域函数(let、run、with、apply、also)用于简化对象操作和代码逻辑,但它们的行为和适用场景各有不同。以下是对它们的详细对比及使用场景指南:

一、核心对比表格

函数接收者对象引用返回值主要使用场景是否支持空安全
letitLambda 表达式结果处理可空对象、转换结果、链式操作✔️ (?.let)
runthisLambda 表达式结果对象配置并计算结果、替代 with✔️ (?.run)
withthisLambda 表达式结果对非空对象执行多步操作(需显式传入对象)❌
applythis对象本身 (this)对象初始化、属性配置(类似 Builder 模式)❌
alsoit对象本身 (it)执行副作用操作(如日志、验证)、链式附加操作❌

二、详细解析与示例

1、 let

  • 特点:

    • 通过 it 引用对象。
    • 返回 Lambda 表达式的结果。
    • 常用于处理可空对象或链式操作。
  • 适用场景:

    • 可空对象处理:避免空检查。
    • 数据转换:将对象转换为另一类型。
    • 链式调用:在链式操作中处理中间结果。
  • 示例:

    kotlin
    代码解读
    复制代码
    val name: String? = "Kotlin" val length = name?.let { println("Processing: $it") // 输出 "Processing: Kotlin" it.length } ?: 0

2、run

  • 特点:

    • 通过 this 引用对象(隐式接收者)。
    • 返回 Lambda 表达式的结果。
    • 两种形式:扩展函数 obj.run { ... } 和非扩展函数 run { ... }。
  • 适用场景:

    • 对象配置并计算结果:在对象上下文中执行逻辑并返回结果。
    • 替代 with:更简洁地处理非空对象。
  • 示例:

    kotlin
    代码解读
    复制代码
    val result = Person().run { name = "Alice" age = 30 introduce() // 返回 introduce() 的结果 }

3、 with

  • 特点:

    • 通过 this 引用对象(需显式传入对象)。
    • 返回 Lambda 表达式的结果。
    • 非扩展函数,需显式传入对象:with(obj) { ... }。
  • 适用场景:

    • 多步操作非空对象:对同一对象执行多个操作。
    • 替代重复的 obj. 调用。
  • 示例:

    kotlin
    代码解读
    复制代码
    val person = Person("Bob", 25) val info = with(person) { age += 1 "Name: $name, Age: $age" // 返回字符串 }

4、apply

  • 特点:

    • 通过 this 引用对象。
    • 返回对象本身。
    • 常用于对象初始化或配置。
  • 适用场景:

    • 对象初始化:设置多个属性(类似 Builder 模式)。
    • 链式配置:返回对象本身,支持链式调用。
  • 示例:

    kotlin
    代码解读
    复制代码
    val person = Person().apply { name = "Charlie" age = 28 address = "Paris" }

5、also

  • 特点:

    • 通过 it 引用对象。
    • 返回对象本身。
    • 适合执行副作用操作。
  • 适用场景:

    • 附加操作:如日志记录、数据验证。
    • 链式调用中的中间操作:不影响对象本身,但需传递对象。
  • 示例:

    kotlin
    代码解读
    复制代码
    val list = mutableListOf(1, 2, 3).also { println("Initial list: $it") // 输出 "Initial list: [1, 2, 3]" }.add(4)

三、如何选择作用域函数?

1、是否需要返回对象本身?

  • ✔️ apply、also:返回对象本身,适合配置或附加操作。
  • ❌ let、run、with:返回 Lambda 结果,适合转换或计算。

2、是否需要处理可空对象?

  • ✔️ let、run:结合安全调用符 (?.) 处理可空性。
  • ❌ with、apply、also:需手动处理空安全。

3、是否需要隐式接收者 (this) 或显式参数 (it)?

  • this:run、with、apply(更简洁,适合多步操作)。
  • it:let、also(明确引用,避免命名冲突)。

4、是否需要链式调用?

  • apply、also:返回对象本身,支持链式配置。
  • let、run:返回计算结果,适合中间转换。

四、总结

  • let:处理可空对象、数据转换。
  • run:对象配置并返回结果。
  • with:对已知非空对象执行多步操作。
  • apply:对象初始化或属性配置。
  • also:附加操作(日志、验证)。

通过明确每个函数的行为和返回类型,结合具体场景选择最合适的函数,可显著提升代码的简洁性和可读性。

更多分享

  1. 一文吃透Kotlin中冷流(Clod Flow)和热流(Hot Flow)
  2. 一文带你吃透Kotlin协程的launch()和async()的区别
  3. 一文带你吃透接口(Interface)结合 @AutoService 与 ServiceLoader 详解
  4. 一文带你吃透Android中显示Intent与隐式Intent的区别
  5. 一文带你吃透Kotlin中 lateinit 和 by lazy 的区别和用法
注:本文转载自juejin.cn的QING618的文章"https://juejin.cn/post/7484089977260703807"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top