Kotlin中的内置函数-apply、let

news/发布时间2024/5/15 21:12:42

在使用Kotlin的过程中会经常用到其内置函数,包括apply,let,run,with,also,takeIf,takeUnless函数等,想要更好熟悉Kotlin,这些函数必须烂熟于心,接下来让我们来逐步了解:

apply函数

apply函数,属于内联扩展函数,其扩展了所有的泛型对象,在闭包范围内可以任意调用该对象的任意方法,并在最后返回该对象。也许看到这里你并没有太了解,接下来让我们从简单代码入手:

fun main(){val tips = "Hello this world"println("tips的字符串长度为:${tips.length}")println("tips的最后一个字符为:${tips[tips.length-1]}")println("tips全部置换大小写:${tips.lowercase()}")
}

这段函数很简单,定义一个字符串然后分别打印,对应输出结果为:

image.gif
我们加入apply函数,一般情况下,匿名函数都会持有一个it,但是apply函数没有持有it,而是持有当前this,在这里this = tips本身。我们在原函数中加入对this的引用逻辑,例如以下:

fun main(){val tips = "Hello this world"println("tips的字符串长度为:${tips.length}")println("tips的最后一个字符为:${tips[tips.length-1]}")println("tips全部置换大小写:${tips.lowercase()}")tips.apply { println(this)}
}

对应的打印为:
image.gif
可见,最后打印的this即是tips本身,而在apply中this又可以省略,我们修改打印到对应的apply函数中,则原代码变为以下:

fun main(){val tips = "Hello this world"println("tips的字符串长度为:${tips.length}")println("tips的最后一个字符为:${tips[tips.length-1]}")println("tips全部置换大小写:${tips.lowercase()}")println("---------------------------------------")tips.apply {println(this)println("tips的字符串长度为:${length}")println("tips的最后一个字符为:${this[length-1]}") //这里最外面的this不能省(Collection literals outside of annotations)println("tips全部置换大小写:${this.lowercase()}")}
}

其对应输出结果为:

image.gif
这些不难理解,所以这里我们可以说apply函数扩展的是其对象,同时还能返回生成此对象。那么问题来了,我要这函数有何用?一个语言不可能白设计一个没有作用的函数。比如我们通常声明一个文件,还要同时声明此文件一些特点时:

val file = File("C:\\HelloWorld.java")
file.setReadable(true)
file.setReadOnly()

这样修改为:

val file = File("C:\\HelloWorld.java")
file.apply { setReadable(true)
}.apply { setReadOnly()
}

由于apply函数能返回原对象,所以也支持链式调用。以上代码在功能作用上完全等价。

let函数

属于匿名函数类型,提供了函数式API的编程接口,将原始对象作为参数传递到表达Lamba表达式中,在闭包范围内用it指代原对象,我们还是通过实例来加深理解,先来一段简单函数:

val list = listOf(1, 2, 3, 4, 5, 6)
val first = list.first()
println(first+first)

代码不难理解,可预见输出结果为:

image.gif
再用let函数形式编写如下:

val result = listOf(1, 2, 3, 4, 5, 6).let {it.first()+it.first()
}
println("let结果为$result")

对应输出结果为:

image.gif
可见,let函数所返回的对象,是在函数中运行完的对象,即let函数的返回类型是根据匿名函数最后一行的变化而变化的,这是跟apply函数的一个区别,apply函数返回的永远是函数本身。例如我们添加些apply的代码,如下:

fun main(){val result = listOf(1, 2, 3, 4, 5, 6).let {it.first()+it.first()}val result2 = listOf(1, 2, 3, 4, 5, 6).apply {this.first()+this.first()}println("let结果为$result")println("apply结果为$result2")
}

对应输出结果为:

image.gif

总结

在这里我们对两个函数总结一下:

apply

1、函数返回的类型都是原泛型对象本身;

2、函数内部持有的是this,原对象本身。

Let

1、let函数所返回的对象,是在函数中运行完的对象,即let函数的返回类型是根据匿名函数最后一行的变化而变化的;

2、函数内部持有的是it。

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

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

相关文章

vue+django+python办公耗材网上商城采购库存管理系统

办公耗材采购信息管理是信息行业业务流程过程中十分重要且必备的环节之一,在信息行业业务流程当中起着承上启下的作用,其重要性不言而喻。但是,目前许多信息行业在具体的业务流程处理过程中仍然使用手工操作的方式来实施,不仅费时…

网络基础与通信原理:构建数字世界的框架

目录 初识计算机网络 网络介绍 按照拓扑分类 按地域分类 网络设备 交换机(switch) 路由器(router) 传输介质 双绞线 光纤 光纤速度 ISO ISO和OSI有什么关系呢? OSI七层模型 TCP/IP四层 TCP/IP协议族 …

html的超链接标签 a

超链接标签: a a标签有2个重要的属性,href和target属性。 href:必须具备,表示点击后会跳转到哪个页面 target:打开方式.默认是 _self.如果是 _blank则用新的标签页打开. 超链接href属性的使用展示 1.通过图片展示 示例代码 运行效果: 点…

Hologres + Flink 流式湖仓建设

Hologres Flink 流式湖仓建设 1 Flink Hologres 特性1.2 实时维表 Lookup1.3 高性能实时写入与更新1.4 多流合并1.5 Hologres 作为 Flink 的数据源1.6 元数据自动发现与更新 2 传统实时数仓分层方案2.1传统实时数仓分层方案 1:流式 ETL2.2 传统实时数仓分层方案 2…

离线安装腾讯x5内核(附安装包下载地址)

背景:由于项目需要在一个定制android设备上播放RTSP流视频,设备自带的浏览器内核不支持RTSP流播放,这就导致我使用webview播放h5网址上的视频的时候,无法正常播放视频。在android手机上都是可以播放的,所以猜测是定制a…

虹科方案 | 释放总线潜力:汽车总线离线模拟解决方案

来源:虹科汽车智能互联 虹科方案 | 释放总线潜力:汽车总线离线模拟解决方案 原文链接:https://mp.weixin.qq.com/s/KGv2ZOuQMLIXlOiivvY6aQ 欢迎关注虹科,为您提供最新资讯! #汽车总线 #ECU #汽车网关 导读 传统的…

ASP.NET-实现图形验证码

ASP.NET 实现图形验证码能够增强网站安全性,防止机器人攻击。通过生成随机验证码并将其绘制成图像,用户在输入验证码时增加了人机交互的难度。本文介绍了如何使用 C# 和 ASP.NET 创建一个简单而有效的图形验证码系统,包括生成随机验证码、绘制…

javaweb学习day03(JS+DOM)

一、javascript入门 1 官方文档 地址: https://www.w3school.com.cn/js/index.asp离线文档: W3School 离线手册(2017.03.11 版).chm 2 基本说明 JavaScript 能改变 HTML 内容,能改变 HTML 属性,能改变 HTML 样式 (CSS),能完成 页面的数据…

“成像光谱遥感技术中的AI革命:ChatGPT应用指南“

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境,是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型,在理解和生成人类语言方面表现出了非凡的能力。本课程重点介绍ChatGPT在遥感中的应用,人工智…

[OPEN SQL] 删除数据

DELETE语句用于删除数据库表中的数据 本次操作使用的数据库表为SCUSTOM&#xff0c;其字段内容如下所示 航班用户(SCUSTOM) 需要删除以下数据 1.删除单条数据 语法格式 DELETE <dbtab> FROM <wa>. DELETE <dbtab> FROM TABLE <itab>. DELETE FROM &…

Apipost推出的IDEA插件值得一试!

Apipost-Helper是由Apipost推出的IDEA插件&#xff0c;写完接口可以进行快速调试&#xff0c;且支持搜索接口、根据method跳转接口&#xff0c;还支持生成标准的API文档&#xff0c;注意&#xff1a;这些操作都可以在代码编辑器内独立完成&#xff0c;非常好用&#xff01;这里…

jmeter 命令行启动 动态参数化

[Jmeter命令行参数] 一、在linux中&#xff0c;使用非gui的方式执行jmeter。若需更改参数&#xff0c;必须先编辑jmx文件&#xff0c;找到对应的变量进行修改&#xff0c;比较麻烦。因此&#xff0c;可以参数化一些常用的变量&#xff0c;直接在Jmeter命令行进行设置 二、参数…

数字化转型导师坚鹏:政府数字化转型之数字化技术

政府数字化转型之数字化技术 ——物联网、云计算、大数据、人工智能、虚拟现实、区块链、数字孪生、元宇宙等综合解析及应用 课程背景&#xff1a; 数字化背景下&#xff0c;很多政府存在以下问题&#xff1a; 不清楚新技术的发展现状&#xff1f; 不清楚新技术的重要应…

压制es-hadoop这头野兽的方式来了~

背景 每天elasticsearch集群在上午某个时间段CPU几乎打满&#xff0c;此时访问elasticsearch的服务rt会跟着抖动&#xff0c;通过排查发现是由于这个时间段会有数据通过hive任务写到elasticsearch&#xff0c;这个hive任务使用的是ES-Hadoop插件做的数据导入&#xff0c;整个问…

C# redis 菜鸟级别 订阅与频道,发送消息

// 建立 Redis 连接 发送部分代码 using StackExchange.Redis; ConnectionMultiplexer redis ConnectionMultiplexer.Connect("127.0.0.1:6379,password123456"); // 获取发布者 ISubscriber publisher redis.GetSubscriber(); // 发布消息到指定频道 string c…

我的音乐伙伴:南卡、韶音、墨觉三款热门骨传导耳机体验分享

作为一个热爱运动的音乐爱好者。对我来说&#xff0c;没有什么能比在运动时配上心爱的歌曲更让人兴奋的了。不管是清晨的跑步&#xff0c;还是傍晚的散步&#xff0c;音乐总能激发我更多的能量。但是&#xff0c;找到既能陪伴我完成高强度训练&#xff0c;又不失音质的耳机&…

C++文件操作

文件操作 程序运行时产生的数据都属于临时数据&#xff0c;程序一旦运行结束都会被释放 通过文件可以将数据持久化 C中对文件操作需要包含头文件 < fstream > 文件类型分为两种&#xff1a; 文本文件 - 文件以文本的ASCII码形式存储在计算机中二进制文件 - 文件以文…

版本控制(Git)

Fork 本课程网站的仓库 将版本历史可视化并进行探索是谁最后修改了 README.md文件&#xff1f;&#xff08;提示&#xff1a;使用 git log 命令并添加合适的参数&#xff09;最后一次修改_config.yml 文件中 collections: 行时的提交信息是什么&#xff1f;&#xff08;提示&am…

探索 LRU 算法的缺陷与解决方案

LRU算法 Linux 的 Page Cache 和 MySQL 的 Buffer Pool 的大小是有限的&#xff0c;并不能无限的缓存数据&#xff0c;对于一些频繁访问的数据我们希望可以一直留在内存中&#xff0c;而一些很少访问的数据希望可以在某些时机可以淘汰掉&#xff0c;从而保证内存不会因为满了而…

逻辑回归为什么使用交叉熵而不用均方差?

逻辑回归为什么使用交叉熵而不用均方差&#xff1f;或者说逻辑回归的损失函数为什么不用最小二乘&#xff1f; 下面主要从两个角度进行阐述&#xff1a; 从逻辑回归的角度出发&#xff0c;逻辑回归的预测值是一个概率&#xff0c;而交叉熵又表示真实概率分布与预测概率分布的…
推荐文章