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

news/2025/2/9 9:04:44/

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/news/1570545.html

相关文章

Win10 部署llama Factory 推荐教程和遇到的问题

教程 【大模型微调】使用Llama Factory实现中文llama3微调_哔哩哔哩_bilibili 大模型微调&#xff01;手把手带你用LLaMA-Factory工具微调Qwen大模型&#xff01;有手就行&#xff0c;零代码微调任意大语言模型_哔哩哔哩_bilibili 遇到问题解决办法 pytorch gpu国内镜像下载…

101.对称二叉树 python

对称二叉树 题目题目描述示例 1&#xff1a;示例 2&#xff1a;提示&#xff1a; 题解递归法步骤提交结果 迭代法步骤提交结果 题目 题目描述 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出…

客户端脚本安全设置:如何保障您的Web应用免受攻击?

随着现代Web开发的不断发展&#xff0c;客户端脚本在增强用户互动和提升网站体验方面扮演着重要角色。然而&#xff0c;这些便利的背后也伴随着潜在的安全风险&#xff0c;恶意攻击者可能会利用这些漏洞进行攻击。因此&#xff0c;确保客户端脚本的安全至关重要。本文将带您了解…

Centos Ollama + Deepseek-r1+Chatbox运行环境搭建

Centos Ollama Deepseek-r1Chatbox运行环境搭建 内容介绍下载ollama在Ollama运行DeepSeek-r1模型使用chatbox连接ollama api 内容介绍 你好&#xff01; 这篇文章简单讲述一下如何在linux环境搭建 Ollama Deepseek-r1。并在本地安装的Chatbox中进行远程调用 下载ollama 登…

Android双屏异显Presentation接口使用说明

在点餐、收银、KTV等场景,对于双屏异显的需求是非常多的,首先可以节省硬件成本。而现在的智能板卡很多运行Android系统,从Android4.2开始支持WiFi Display(Miracast)功能后,就开始支持双屏异显Presentation这套应用层接口了,下面以Android5.1系统来说明这套接口的使用要…

【数据结构】_树与二叉树

目录 1.树的概念和结构 1.1 树的概念 1.2 树的相关概念 1.3 树的表示 2. 二叉树的概念与结构 2.1 概念 2.2 特殊二叉树 2.3 二叉树的性质 2.4 二叉树的存储结构 第一种&#xff1a;顺序存储结构 第二种&#xff1a;链式存储结构 1.树的概念和结构 1.1 树的概念 树是一…

软件工程导论三级项目报告--《软件工程》课程网站

《软件工程》课程网站 摘要 本文详细介绍了《软件工程》课程网站的设计与实现方案&#xff0c;包括可行性分析、需求分析、总体设计、详细设计、测试用例。首先&#xff0c;通过可行性分析从各方面确认了该工程的可实现性&#xff0c;接着需求分析明确了系统的目标用户群和功能…

java 读取sq3所有表数据到objectNode

1.实现效果&#xff1a;将sq3中所有表的所有字段读到objectNode 对象中&#xff0c;兼容后期表字段增删情况&#xff0c;数据组织形式如下图所示&#xff1a; 代码截图&#xff1a; 代码如下&#xff1a; package com.xxx.check.util;import java.sql.*; import java.util.Arr…