Kotlin 作用域函数(let、run、with、apply、also)对比

Kotlin 的 作用域函数(Scope Functions) 是简化代码逻辑的重要工具,它们通过临时作用域为对象提供更简洁的操作方式。以下是 letrunwithapplyalso 的对比分析:


一、核心区别对比表

函数上下文对象引用返回值是否扩展函数典型使用场景
letitLambda 结果非空对象处理、链式操作
runthisLambda 结果对象配置 + 结果计算
withthisLambda 结果对象的多属性操作
applythis对象本身对象初始化配置
alsoit对象本身对象附加操作(如日志、验证)

二、详细对比与使用场景

1. let
val result = obj.let { // 操作 it 对象,返回最后一行结果it.doSomething()"Result" 
}
  • 特点
    • 通过 it 引用上下文对象,避免与外部作用域的 this 冲突。
    • 处理可空对象:配合 ?. 安全调用(obj?.let { ... })。
    • 链式操作:将对象转换为其他结果。
2. run
val result = obj.run { // 直接访问 this(可省略),返回最后一行结果doSomething()"Result"
}
  • 特点
    • 结合了 with 的作用域和 let 的扩展函数特性。
    • 同时操作对象属性并返回结果:适合对象配置后立即计算结果的场景。
3. with
val result = with(obj) {// 直接访问 this(可省略),返回最后一行结果doSomething()"Result"
}
  • 特点
    • 非扩展函数,直接传入对象。
    • 批量操作对象属性:例如初始化对象或对对象进行多次修改。
4. apply
val obj = MyClass().apply { // 直接访问 this(可省略),返回对象本身name = "Kotlin"age = 10
}
  • 特点
    • 返回对象本身,适合对象初始化或链式配置。
    • 类似建造者模式(Builder Pattern)。
5. also
val obj = MyClass().also { // 通过 it 引用对象,返回对象本身println("Created: $it")
}
  • 特点
    • 执行副作用操作:如打印日志、验证数据,但不修改对象。
    • 链式调用中插入额外操作。

三、选择依据

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

    • 是 → applyalso
    • 否 → letrunwith
  2. 上下文对象引用方式

    • 需要显式名称(避免 this 冲突) → letalso(使用 it)。
    • 隐式访问属性 → runwithapply(使用 this)。
  3. 处理可空性

    • 使用 ?.let 安全处理可空对象。
  4. 是否需要扩展函数?

    • 是 → 排除 with

四、经典示例

// let:处理可空对象 + 转换结果
val length = nullableString?.let { it.trim().length 
} ?: 0// apply:对象初始化
val person = Person().apply {name = "Alice"age = 30
}// also:链式调用插入日志
val list = mutableListOf(1, 2, 3).also { println("Initial list: $it") }.apply { add(4) }.also { println("Updated list: $it") }

通过理解上下文引用方式、返回值和典型场景,可以更精准地选择合适的作用域函数,提升代码简洁性和可读性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/83425.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

14、Python时间表示:Unix时间戳、毫秒微秒精度与time模块实战

适合人群:零基础自学者 | 编程小白快速入门 阅读时长:约5分钟 文章目录 一、问题:计算机中的时间的表示、Unix时间点?1、例子1:计算机的“生日”:Unix时间点2、答案:(1)U…

AI日报 - 2024年5月17日

🌟 今日概览 (60秒速览) ▎🤖 大模型前沿 | OpenAI推出自主编码代理Codex;Google DeepMind发布Gemini驱动的编码代理AlphaEvolve,能设计先进算法;Meta旗舰AI模型Llama 4 Behemoth发布推迟。 Codex能并行处理多任务&…

DriveMM:用于自动驾驶的一体化大型多模态模型——论文阅读

《DriveMM: All-in-One Large Multimodal Model for Autonomous Driving》2024年12月发表,来自中山大学深圳分校和美团的论文。 大型多模态模型(LMM)通过整合大型语言模型,在自动驾驶(AD)中表现出卓越的理解…

C++_STL_map与set

1. 关联式容器 在初阶阶段,我们已经接触过STL中的部分容器,比如:vector、list、deque、 forward_list(C11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面 存储的是元素本身。那什么是…

【嵌入式开发-RGB 全彩 LED】

嵌入式开发-RGB 全彩 LED ■ RGB 全彩 LED简介■ 电路设计■ ■ RGB 全彩 LED简介 RGB 全彩 LED 模块显示不同的颜色。 ■ 电路设计 全彩 LED 使用 PA5、 蓝色(B) TIM2_CHN3 PA1、 绿色(G)TIM2_CHN2 PA2、 红色(R&am…

计算机网络:手机和基站之间的通信原理是什么?

手机与基站之间的通信是无线通信技术的核心应用之一,涉及复杂的物理层传输、协议交互和网络管理机制。以下从技术原理、通信流程和关键技术三个层面深入解析这一过程: 一、蜂窝网络基础架构 1. 蜂窝结构设计 基本原理:将服务区域划分为多个六边形“蜂窝小区”,每个小区由*…

【Docker】Docker安装RabbitMQ

目录 1.拉取镜像 2. 创建挂载目录 3.创建和启动 4.登录管理端 1.拉取镜像 推荐使用带 Web 管理界面的官方镜像(management) # 拉取docker镜像 docker pull rabbitmq:management响应内容: 2. 创建挂载目录 创建挂载目录和日志目录 #rabb…

交叉编译源码的方式移植ffmpeg-rockchip

获取ffmpeg源码 git submodule add -f https://github.com/FFmpeg/FFmpeg.git thirdparty/FFmpeg 瑞芯微ffmpeg-rk git clone https://github.com/jjm2473/ffmpeg-rk/tree/enc# 参考的一位博主的说法 使用 ffmpeg-rochip 的好处 传统的使用硬件编解码的开发思路是&#xf…

9.0 C# 调用solidworks介绍1

一、C# 与 SolidWorks 联合开发概述 SolidWorks 提供了完整的 API(应用程序接口),允许开发者使用 C# 等编程语言进行二次开发,实现自动化设计、定制功能等。 主要技术要点包括: 1. API 结构:SolidWorks API 是基于 COM 的接口,包含数百个对象和数千个方法…

AD 多层线路及装配图PDF的输出

装配图的输出: 1.点开‘智能PDF’ 2. 设置显示顶层: 设置显示底层: 多层线路的输出 同样使用‘智能PDF’

SpringBoot + Shiro + JWT 实现认证与授权完整方案实现

SpringBoot Shiro JWT 实现认证与授权完整方案 下面博主将详细介绍如何使用 SpringBoot 整合 Shiro 和 JWT 实现安全的认证授权系统,包含核心代码实现和最佳实践。 一、技术栈组成 技术组件- 作用版本要求SpringBoot基础框架2.7.xApache Shiro认证和授权核心1.…

PCIe数据采集系统详解

PCIe数据采集系统详解 在上篇文章中,废了老大劲儿我们写出了PCIe数据采集系统;其中各个模块各司其职,相互配合。完成了从数据采集到高速存储到DDR3的全过程。今天我们呢就来详细讲解他们之间的关系?以及各个模块的关键点&#xff…

2025云智算技术白皮书

1. 云智算的演进背景 传统云计算面临三大挑战: 算力需求激增:AI大模型训练需十万卡级GPU集群,资源调度能力不足。网络性能瓶颈:TB级参数同步对低时延、高吞吐要求远超传统网络架构。服务形态单一:IaaS/PaaS无法覆盖A…

C语言编程中的时间处理

最简单的time 在C语言编程中&#xff0c;处理时间最简单的函数就是time了。它的原型为&#xff1a; #include <time.h> time_t time(time_t *_Nullable tloc);返回自从EPOCH&#xff0c;即1970年1月1日的零点零时零分&#xff0c;到当前的秒数。 输入参数可以是NULL。…

适应性神经树:当深度学习遇上决策树的“生长法则”

1st author: Ryutaro Tanno video: Video from London ML meetup paper: Adaptive Neural Trees ICML 2019 code: rtanno21609/AdaptiveNeuralTrees: Adaptive Neural Trees 背景 在机器学习领域&#xff0c;神经网络&#xff08;NNs&#xff09;凭借其强大的表示学习能力&…

InitVerse节点部署教程

项目介绍: InitVerse 是一个为新兴企业量身定制的自动化 Web3 SaaS 平台,只需单击几下即可快速开发和部署 DApp。在 INIChain 和 INICloud 的支持下,InitVerse 可以根据需求动态调整计算资源,实现高效的任务处理,同时提供更高的安全性、可用性和可扩展性。 系统要求: C…

阿里开源通义万相 Wan2.1-VACE,开启视频创作新时代

0.前言 阿里巴巴于2025年5月14日正式开源了其最新的AI视频生成与编辑模型——通义万相Wan2.1-VACE。这一模型是业界功能最全面的视频生成与编辑工具&#xff0c;能够同时支持多种视频生成和编辑任务&#xff0c;包括文生视频、图像参考视频生成、视频重绘、局部编辑、背景延展…

解决“VMware另一个程序已锁定文件的一部分,进程无法访问“

问题描述 打开VMware里的虚拟机时&#xff0c;弹出"另一个程序已锁定文件的一部分&#xff0c;进程无法访问"如图所示&#xff1a; 这是VM虚拟机的保护机制。虚拟机运行时&#xff0c;为防止数据被篡改&#xff0c;会将所运行的文件保护起来。当虚拟机崩溃或者强制…

基于大数据的租房信息可视化系统的设计与实现【源码+文档+部署】

课题名称 基于大数据的租房信息可视化系统的设计与实现 学 院 专 业 计算机科学与技术 学生姓名 指导教师 一、课题来源及意义 租房市场一直是社会关注的热点问题。随着城市化进程的加速&#xff0c;大量人口涌入城市&#xff0c;导致租房需求激增。传统的租…

Vue3封装公共图片组件

对图片加载做的处理: 图片加载状态响应式管理图片访问错误的处理机制图片懒加载可通过slot支持自定义加载动画其他监听事件的处理及向上传递 …<!-- components/CustomImage.vue --> <template><div class="custom-image-wrapper"><!-- 主图 -…