首页 最新 热门 推荐

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

一句话说透kotlin里面run、let、apply、also、with

  • 25-04-18 23:46
  • 2758
  • 12389
juejin.cn

在Kotlin中,run、let、apply、also和with是作用域函数,用于在对象上下文中执行代码块,简化代码并增强可读性。它们的核心区别在于上下文对象的引用方式和返回值类型。以下是每个函数的详细解释及使用场景:


1. let

  • 语法:object.let { it -> ... }

  • 上下文对象:通过 it 引用。

  • 返回值:Lambda 表达式的结果。

  • 适用场景:

    • 处理可空对象(配合 ?. 使用)。
    • 对对象进行转换或计算后返回新结果。
    • 执行副作用操作(如日志记录)。

示例:

kotlin
代码解读
复制代码
val name: String? = "Alice" val length = name?.let { println("Name: $it") it.length // 返回长度 } ?: 0 // 如果name为null,返回0

2. run

  • 语法:object.run { this -> ... }(扩展函数)或 run { ... }(非扩展函数)

  • 上下文对象:通过 this 引用(可省略)。

  • 返回值:Lambda 表达式的结果。

  • 适用场景:

    • 访问对象的属性或方法(类似 with,但作为扩展函数)。
    • 执行代码块并返回结果(无需对象参与时用非扩展形式)。

示例:

ini
代码解读
复制代码
val person = Person().run { name = "Bob" // this.name 可省略this age = 25 this // 显式返回对象(否则返回最后一行) } val result = run { val x = 2 x * 3 // 返回6(非扩展形式) }

3. apply

  • 语法:object.apply { this -> ... }

  • 上下文对象:通过 this 引用(可省略)。

  • 返回值:对象本身(即 object)。

  • 适用场景:

    • 初始化或配置对象(如设置属性)。
    • 链式调用中返回对象本身。

示例:

ini
代码解读
复制代码
val car = Car().apply { color = "Red" // 直接访问属性 speed = 200 } // 返回Car实例

4. also

  • 语法:object.also { it -> ... }

  • 上下文对象:通过 it 引用。

  • 返回值:对象本身(即 object)。

  • 适用场景:

    • 执行副作用操作(如日志、验证)而不改变对象。
    • 链式调用中插入额外操作。

示例:

scss
代码解读
复制代码
val list = mutableListOf(1, 2, 3).also { println("初始列表:$it") // 打印初始状态 }.add(4) // 返回true,但list仍然是MutableList

5. with

  • 语法:with(object) { this -> ... }

  • 上下文对象:通过 this 引用(可省略)。

  • 返回值:Lambda 表达式的结果。

  • 适用场景:

    • 对非空对象执行多个操作。
    • 将对象作为参数集中处理。

示例:

kotlin
代码解读
复制代码
val person = Person("Charlie", 30) val info = with(person) { "Name: $name, Age: $age" // 直接访问属性 } // 返回字符串

对比总结

函数上下文对象返回值典型场景
letitLambda 结果可空处理、转换、副作用
runthisLambda 结果配置对象或计算值
applythis对象本身初始化对象、链式配置
alsoit对象本身副作用操作、链式调用插入
withthisLambda 结果集中操作非空对象

选择建议

  • 需要返回对象本身 → 用 apply 或 also。

    • 配置属性 → apply(this 更简洁)。
    • 添加副作用 → also(明确用 it)。
  • 需要返回计算结果 → 用 let、run 或 with。

    • 可空对象处理 → let + ?.。
    • 对象属性操作 → run 或 with。
  • 无对象参与的计算 → 非扩展的 run。


通过理解这些函数的差异,可以更简洁、安全地处理对象操作,提升代码可读性和维护性

一句话总结

以下五种类型都是作用域函数,用法不同表现如下:

  • ​run 用来做计算​(比如根据对象算个值),
  • ​let 用来防空或转换​(比如判空后处理),
  • ​apply 用来搞配置​(比如给对象设一堆属性),
  • ​also 用来干杂活​(比如操作对象时顺带打个日志),
  • ​with 用来批量调方法​(比如对对象连续调多个方法)。
注:本文转载自juejin.cn的双鱼大猫的文章"https://juejin.cn/post/7470453745290936358"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

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

分类栏目

后端 (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)

热门文章

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