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

ops/2025/2/10 13:14:47/

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

  • 返回值: 对象本身。

  • 使用场景:

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

    • 逐步构建一个对象。

    • 使用构建器模式。

  • 示例:

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

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

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

  • 使用场景:

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

    kotlin">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(或自定义名称)
  • 返回值: 对象本身。
  • 使用场景:
    • 日志记录或调试。
    • 执行一些不需要改变对象状态,但需要执行的操作。
    • 在操作链中添加副作用。
  • 示例:
kotlin">val numbers = mutableListOf<Int>()
val result = listOf(1, 2, 3).also {

http://www.ppmy.cn/ops/157254.html

相关文章

PrimeFaces Poll组件实现周期性Ajax调用

在日常的Web开发中&#xff0c;我们常常需要实现一些周期性的功能&#xff0c;例如实时更新数据、轮询服务器状态等。PrimeFaces的Poll组件为我们提供了一种简单而强大的方式来实现这些功能。今天&#xff0c;我们就通过一个具体的例子来学习如何使用Poll组件来实现周期性的Aja…

CMake 小知识:CMAKE_INSTALL_PREFIX 与 option 变量的覆盖规则

1、CMAKE_INSTALL_PREFIX&#xff1a;安装路径的设置与使用 1.1、什么是CMAKE_INSTALL_PREFIX CMAKE_INSTALL_PREFIX 是 CMake 中用于指定项目安装路径的变量。当我们使用 make install 或 cmake --install 命令时&#xff0c;生成的文件&#xff08;如可执行文件、库文件、头…

AIGC-辅助小说(斗破苍穹为例)创作智能体完整指令(DeepSeek,豆包,千问,Kimi,GPT)

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列AIGC(GPT、DeepSeek、豆包、千问、Kimi)👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资…

动手学图神经网络(10):利用 PyTorch Geometric 进行图分类

利用 PyTorch Geometric 进行图分类 本文将详细介绍如何使用 PyTorch Geometric 库进行图分类任务,同时结合 Weights & Biases(W&B)工具对实验进行跟踪和可视化。 环境设置 首先, 需要安装一些必要的库,包括 PyTorch Geometric 用于实现图神经网络,plotly 用于…

DeepSeek-R1系列(1.5b/7b/8b/32b/70b/761b)大模型部署需要什么硬件条件

一、轻量级模型(1.5B-7B参数) 1.5B模型 CPU:最低4核(推荐Intel/AMD多核处理器) 内存:8GB+(纯CPU推理) 显卡:非必需,若需加速可选4GB+显存(如GTX 1650) 存储:3GB+(模型文件约1.5-2GB) 适用场景:低资源设备(如树莓派、旧笔记本)、简单文本生成或物联网设备 7B模…

C++ Primer 逗号运算符

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

Nginx进阶篇 - nginx多进程架构详解

文章目录 1. nginx的应用特点2. nginx多进程架构2.1 nginx多进程模型2.2 master进程的作用2.3 进程控制2.4 worker进程的作用2.5 worker进程处理请求的过程2.6 nginx处理网络事件 1. nginx的应用特点 Nginx是互联网企业使用最为广泛的轻量级高性能Web服务器&#xff0c;其特点是…

CSGHub高效管理|解锁DeepSeek R1蒸馏模型 :高效推理的新选择

在大模型的新时代&#xff0c;如何在保持高推理能力的同时降低计算成本&#xff0c;已经成为企业和开发者们关注的核心问题。 你是否也在寻找一个既强大又高效的AI模型&#xff1f; DeepSeek R1&#xff0c;作为目前领先的AI模型之一&#xff0c;不仅推出了强大的671B参数旗舰模…