当前位置: 首页 > article >正文

Kotlin 的作用域函数:apply、let、also、run,以及 with、takeIf 和 takeUnless。函数的用法和使用场景

Kotlin中提供几个常用的作用域函数,如果能将它们熟练运用,那将会有效的提高开发效率,降低开发时间,同时保证程序的稳定。那分别是哪几个作用域函数?

Kotlin 的作用域函数:apply、let、also、run,以及 with、takeIf 和 takeUnless。这些函数是编写简洁、富有表现力的 Kotlin 代码的利器。它们都具有相似的语法,但在细微之处有所不同, 因此适用于不同的场景。

一、核心概念

在深入了解每个函数之前,让我们先理解一些共同点:

  • 作用域函数(Scope Functions): 这些函数被称为“作用域函数”,因为它们会创建一个临时作用域, 你可以在这个作用域内对一个对象进行操作。
  • Lambda 接收者 vs. Lambda 参数: 这些函数之间的关键区别在于它们如何在 lambda 表达式中提供对象:
    • Lambda 接收者 (this): apply 和 run 将对象作为 lambda 接收者 提供。这意味着你可以直接访问对象的成员, 就像你在对象类内部一样。
    • Lambda 参数 (it): let 和 also 将对象作为 lambda 参数 提供。这意味着你使用隐式的 it 关键字(或者你可以给它一个不同的名字)来访问对象。
  • 返回值: 它们的返回值也不同:
    • 对象本身: apply 和 also 返回原始对象。
    • Lambda 结果: let 和 run 返回 lambda 表达式的结果。
二、函数详解

现在,让我们详细地看看每个函数:

  1. apply
  • 用途: 配置一个对象。

  • Lambda 接收者: this

  • 返回值: 对象本身。

  • 使用场景:

    • 初始化或配置对象的属性。

    • 逐步构建一个对象。

    • 使用构建器模式。

  • 示例:

data class Person(var name: String = "", var age: Int = 0, var city: String = "")

val person = Person().apply {
   
    name = "爱丽丝"
    age = 30
    city = "纽约"
}
println(person) // 输出:Person(name=爱丽丝, age=30, city=纽约)
  • 解释:
    • 我们创建了一个 Person 对象。
    • apply 让我们可以在 lambda 表达式中直接配置其属性。
    • apply 返回修改后的 person 对象。
  1. let
  • 用途: 对一个非空对象执行一段代码。

  • Lambda 参数: it(或自定义名称)

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

  • 使用场景:

    • 空值检查和安全调用。
    • 为对象引入一个新的作用域。
    • 转换一个对象。
  • 示例:

    fun processName(name: String?) {
         
        name?.let {
         
            val upperCaseName = it.uppercase()
            println("大写名字:$upperCaseName")
            upperCaseName.length // 返回名字的长度
        }
    }
    
    processName("鲍勃") // 输出:大写名字:鲍勃
    processName(null) // 没有输出
    
  • 解释:

    • name?.let { … } 是一个安全调用。只有当 name 不为 null 时,才会执行 lambda 表达式。
    • it 在 lambda 表达式中引用非空的 name。
    • let 返回 lambda 表达式的结果(在这个例子中,是名字的长度) 。
  1. also
  • 用途: 对一个对象执行一些副作用操作。
  • Lambda 参数: it(或自定义名称)
  • 返回值: 对象本身。
  • 使用场景:
    • 日志记录或调试。
    • 执行一些不需要改变对象状态,但需要执行的操作。
    • 在操作链中添加副作用。
  • 示例:
val numbers = mutableListOf<Int>()
val result = listOf(1, 2, 3)
    .also {
   

http://www.kler.cn/a/538040.html

相关文章:

  • JAVA中的抽象学习
  • 优化GPT API接口链接的方法
  • 【系统架构设计师】嵌入式系统之JTAG接口
  • Linux 创建进程 fork()、vfork() 与进程管理
  • 保姆级教程Docker部署Zookeeper模式的Kafka镜像
  • DeepSeek在FPGA/IC开发中的创新应用与未来潜力
  • Java即时编译器(JIT)的原理及在美团的实践经验
  • 1456. 定长子串中元音的最大数目
  • openGauss 3.0 数据库在线实训课程6:学习用户一次只能连接到一个数据库,没法访问其他数据库的对象
  • Redis06 - Redis集群为什么是Hash槽而不是一致性哈希
  • ubuntu 本地部署deepseek r1 蒸馏模型
  • 用 Lambda 表达式处理 Java Stream 流操作
  • 装备库室管控系统|支持国产化、自主研发
  • 【医院运营统计专题】2.运营统计:医院管理的“智慧大脑”
  • 【Milvus】向量数据库pymilvus使用教程
  • 2022java面试总结,1000道(集合+JVM+并发编程+Spring+Mybatis)的Java高频面试题
  • Vue | 透传 Attributes(非 prop 的 attribute )
  • STM32 硬件I2C读写MPU6050
  • V8 GC垃圾回收
  • 一步一步生成音乐类小程序的详细指南,结合AI辅助开发的思路
  • android studio无痛入门
  • 西安科技创新领跑者:树莓集团以科技创新赋能产业生态圈
  • Milvus 存储设计揭秘:从数据写入到 Segment 管理的全链路解析
  • 深入浅出Log4j2:从入门到实战应用指南
  • C语言基础系列【6】流程控制
  • 快速建立私有化知识库(私有化训练DeepSeek,通过ollama方式)