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

kotlin内联函数——let,run,apply,also,with的区别

一、概述

为了帮助您根据使用场景选择合适的作用域函数(scope function),我们将对它们进行详细描述并提供使用建议。从技术上讲,许多情况下范围函数是可以互换使用的,因此示例中展示了使用它们的约定俗成的做法。

1.let函数

  • 上下文对象作为参数(it)提供。

  • 返回值:lambda表达式结果.

let可以用于在调用链的结果上调用一个或多个函数。例如:

var name = "kotlin"
var sub = name.substring(0,2)
println(sub)

用let重写上面的例子,不用分配一个新的变量就会直接输出结果:

var name = "kotlin"
name.substring(0,2).let {println(it)
}

let代码块里,如果只有一个函数,且函数只有一个参数it,可以用::代替it参数:

var name = "kotlin"
name.substring(0,2).let(::println)

let代码块里操作的数值为非空值,为了操作非空数值,需要在let前用?.操作符:

val name: String? = null
name?.let {println(it)
}

为了让代码更用阅读可以自定义变量,代替it参数:

val name: String = "kotlin"
val child: String? = name.substring(0, 2)
child?.let { sub ->println(sub)//sub为自定义的变量代替it参数
}

2.with函数

  • 上下文对象作为接收者(this)可用。

  • 返回值:lambda表达式结果.

 with 不是一个扩展函数:上下文对象this作为参数传递,在lamda表达式里this可以被当作接收者.

当不需要返回结果时,推荐用with时,可以引用上下文对象调用方法。例如,

val name = "kotlin"
with(name){println(this)
}

可以在lamda代码块里,引用上下文对象的属性和函数,例如,

val name = "kotlin"
println("result:${with(name) {length + substring(0, 2).length}}"
)

3.run函数

  • 上下文对象作为接收者(this)可用。

  • 返回值:lamda表达式结果

run 跟with作用相同,但run是一个扩展函数。像let,对象可以通过点符号引用run。当lamada表达式中同时有初始化和计算操作,可用run函数。例如,

class User{var name: String? = nullvar age = 0}User().run {name = "java"age = 99Log.d(TAG,"User:$name,$age")}

你还可以将 run 作为非扩展函数来调用。run 的非扩展版本没有上下文对象,但它仍然返回 lambda 表达式的结果。非扩展的 run 允许你在需要表达式的地方执行多个语句的代码块。在代码中,非扩展的 run 可以理解为“运行代码块并计算结果”。例如,

 var name = "c++"name.run {var y = "123"println("$this,$y")}

4.apply函数

  • 上下文对象作为接收者(this)可用。

  • 返回值:this对象本身.

因为 apply 函数返回引用对象本身,主要用于对象的成员操作时,可用apply函数。主要应用appply函数的地方是对象的配置。对apply调用可以被当作是对象的初始化。

class User {var name: String? = nullvar age = 0fun set(ageParam: Int) {age = ageParam}fun get(): Int {return age}}User().apply {name = "java"age = 99set(100)Log.d(TAG, "User:$name,${get()}")}

另一个 apply 的使用场景是将其包含在多个调用链中,以进行更复杂的处理。例如,

class User {var name: String? = nullvar age = 0fun set(ageParam: Int) {age = ageParam}fun get(): Int {return age}}User().apply {name = "java"age = 99set(100)Log.d(TAG, "User:$name,${get()}")}.apply {name = "c++"Log.d(TAG, "User:$name,${get()}")}

5.also函数

  • 上下文对象作为参数(it)提供.

  • 返回值:引用对象本身

also 用于操作上下文参数对象。引用also的操作都是针对引用对象(而不是它的属性和方法)或者是不想对外部作用域隐藏this对象。

常用于链式调用中,在不改变对象的情况下,插入一些中间操作。

当看到also时,可以读作“also跟随对象”。

User().also {it.set(100)Log.d(TAG,"also引用,user:${it.age}")}.also {it.set(99)it.name = "kotlin"}.run {Log.d(TAG,"run引用,user:$name, $age")}

二、区别

1.参数

自定义参数it名字:唯独let函数可以自定义参数it名字

函数参数传递:唯独with函数把引用对象作为参数输入例如,with(name){}

2.返回值

let,with和run返回值为lamda表达式结果,而apply和also返回值为引用对象本身

3.参数this和it

参数为this的函数为with,run和apply,可直接操作对象的属性和方法。

参数为it的函数为不能直接操作对象的属性和方法。

推荐文章

Scope functions | Kotlin Documentation

相关文章:

kotlin内联函数——let,run,apply,also,with的区别

一、概述 为了帮助您根据使用场景选择合适的作用域函数(scope function),我们将对它们进行详细描述并提供使用建议。从技术上讲,许多情况下范围函数是可以互换使用的,因此示例中展示了使用它们的约定俗成的做法。 1.…...

【深度学习|DenseNet-121】Densely Connected Convolutional Networks内部结构和参数设置

【深度学习|DenseNet-121】Densely Connected Convolutional Networks内部结构和参数设置 【深度学习|DenseNet-121】Densely Connected Convolutional Networks内部结构和参数设置 文章目录 【深度学习|DenseNet-121】Densely Connected Convolutional Networks内部结构和参数…...

数据结构与算法-要点整理

知识导图: 一、数据结构 包含:线性表(数组、队列、链表、栈)、散列表、树(二叉树、多路查找树)、图 1.线性表 数据之间就是“一对一“的逻辑关系。 线性表存储数据的实现方案有两种,分别是顺序存储结构和链式存储结构。 包含:数组、队列、链表、栈。 1.1 数组…...

Fort Firewall:全方位守护网络安全

Fort Firewall是一款专为 Windows 操作系统设计的开源防火墙工具,旨在为用户提供全面的网络安全保护。它基于 Windows 过滤平台(WFP),能够与系统无缝集成,确保高效的网络流量管理和安全防护。该软件支持实时监控网络流…...

Nginx实战技巧(Practical Tips for nginx)

引言 简介 ‌Nginx(发音为 "engine-x")是一个高性能的HTTP和反向代理服务器.‌ Nginx以其高并发处理能力、低资源消耗和灵活的配置而闻名,适用于高流量的Web服务器和应用程序。‌ Nginx的主要功能包括: ‌HTTP服务器…...

YOLOv8:目标检测与实时应用的前沿探索

随着深度学习和计算机视觉技术的迅速发展,目标检测(Object Detection)一直是研究热点。YOLO(You Only Look Once)系列模型作为业界广受关注的目标检测框架,凭借其高效、实时的特点,一直迭代更新…...

解锁数字经济新动能:探寻 Web3 核心价值

随着科技的快速发展,我们正迈入一个全新的数字时代,Web3作为这一时代的核心构成之一,正在为全球数字经济带来革命性的变革。本文将探讨Web3的核心价值,并如何推动数字经济的新动能。 Web3是什么? Web3,通常…...

Lua 环境的安装

1.安装Lua运行环境 本人采用的是在windows系统中使用cmd指令方式进行安装,安装指令如下: winget install "lua for windows" 也曾使用可执行程序安装过,但由于电脑是加密电脑,最后都已失败告终。使用此方式安装可以安…...

Object类(2)

大家好,今天我们继续来看看Object类中一些成员方法,这些方法在实际中有很大的用处,话不多说,来看。 注:所有类都默认继承Object类的,所以可调用Object类中的方法,如equals,也可以发生…...

汽车网络信息安全-ISO/SAE 21434解析(中)

目录 第七章-分布式网络安全活动 1. 供应商能力评估 2. 报价 3. 网络安全职责界定 第八章-持续的网络安全活动 1. 网路安全监控 2. 网络安全事件评估 3. 漏洞分析 4. 漏洞管理 第九章-概念阶段 1. 对象定义 2. 网路安全目标 3. 网络安全概念 第十章 - 产品开发 第十…...

fatal error C1083: ޷[特殊字符]ļ: openssl/opensslv.h: No such file or directory

一、环境 1. Visual Studio 2017 2. edk2:202305 3. Python:3.11.4 二、 fatal error C1083: ޷򿪰ļ: openssl/opensslv.h: No such file or directory 上图出现这个警告,不用管。 出现Done,说明编译成功。 执行上…...

C#System.Threading.Timer定时器意外回收注意事项

System.Threading.Timer定时器使用时会出现意外回收的情况。具体解释如下: 只要在使用 Timer,就必须保留对它的引用。对于任何托管对象,如果没有对 Timer 的引用,计时器会被垃圾回收。即使 Timer 仍处在活动状态,也会被回收。 实例对比测试 实例 定义两个类,其中一个…...

20.Word:小谢-病毒知识的科普文章❗【38】

目录 题目​ NO1.2.3文档格式 NO4.5 NO6.7目录/图表目录/书目 NO8.9.10 NO11索引 NO12.13.14 每一步操作完,确定之后记得保存最后所有操作完记得再次删除空行 题目 NO1.2.3文档格式 样式的应用 选中应用段落段落→开始→选择→→检查→应用一个一个应用ctr…...

vue3底层原理和性能优化

Vue 3 在底层原理和性能优化方面做了许多改进,以下是一些主要的优化点和原理: 1. 虚拟 DOM 的改进 静态树提升:Vue 3 能够检测到静态组件(即不依赖响应式数据的组件)并将其提升到渲染函数之外,从而减少不…...

Ubuntu介绍、与centos的区别、基于VMware安装Ubuntu Server 22.04、配置远程连接、安装jdk+Tomcat

目录 ?编辑 一、Ubuntu22.04介绍 二、Ubuntu与Centos的区别 三、基于VMware安装Ubuntu Server 22.04 下载 VMware安装 1.创建新的虚拟机 2.选择类型配置 3.虚拟机硬件兼容性 4.安装客户机操作系统 5.选择客户机操作系统 6.命名虚拟机 7.处理器配置 8.虚拟机内存…...

金融级分布式数据库如何优化?PawSQL发布OceanBase专项调优指南

前言 OceanBase数据库作为国产自主可控的分布式数据库,在金融、电商、政务等领域得到广泛应用,优化OceanBase数据库的查询性能变得愈发重要。PawSQL为OceanBase数据库提供了全方位的SQL性能优化支持,助力用户充分发挥OceanBase数据库的性能潜…...

springboot 动态线程池

在Spring Boot中,可以使用ThreadPoolTaskExecutor类来创建动态线程池。以下是一个示例: 首先,需要在配置文件中配置线程池的属性,例如最小线程数、最大线程数、线程存活时间等。可以在application.properties或application.yml中…...

【PySide6快速入门】qrc资源文件的使用

文章目录 PySide6快速入门:qrc资源文件的使用前言什么是qrc文件?qrc文件的作用: qrc文件可以干什么?如何创建qrc文件?1. 创建.qrc文件2. 使用rcc工具编译.qrc文件 如何引用qrc文件并使用资源?示例代码&…...

【creo】CREO配置快捷键方式和默认单位

了解CREO工作目录设置 设置快捷方式启动目录,就能自动加载其中的配置。 一、通过键盘快捷方式 保存配置 creo_parametric_customization.ui 文件: 二、通过映射键录制 通过这种方式可以监听鼠标的点击事件。使用键盘快捷方式无法找到需要的动作时候可…...

STM32使用VScode开发

文章目录 Makefile形式创建项目新建stm项目下载stm32cubemx新建项目IED makefile保存到本地arm gcc是编译的工具链G++配置编译Cmake +vscode +MSYS2方式bilibiliMSYS2 统一环境配置mingw32-make -> makewindows环境变量Cmake CmakeListnijia 编译输出elfCMAKE_GENERATOR查询…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

JavaSec-RCE

简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性&#xff0c…...

ES6从入门到精通:前言

ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络&#xf…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

基于 TAPD 进行项目管理

起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

WEB3全栈开发——面试专业技能点P7前端与链上集成

一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染(SSR)与静态网站生成(SSG) 框架,由 Vercel 开发。它简化了构建生产级 React 应用的过程,并内置了很多特性: ✅ 文件系…...