当前位置:网站首页>Kotlin - 标准函数(with、run和apply)
Kotlin - 标准函数(with、run和apply)
2022-08-02 03:27:00 【m0_63970488】
Kotlin的标准函数是指 Standard.kt 文件中定义的函数,任何Kotlin代码都可以自由地调用所有的标准函数。
1.with 函数
首先先从with函数开始,with函数接受两个参数,第一个参数可以是一个任意类型的对象,第二个参数是一个Lambda表达式。with函数会在Lambda表达式中提供第一个参数对象的上下文,并且使用Lambda表达式中的最后一行代码作为返回值进行返回,代码如下:
val with = with(obj) {
//这里是 obj 的上下文
"value" //with 函数的返回值
}那么这个函数有什么用的? 它可以在连续同一个对象的多个方法时让代码变得精简,下面描述一个具体的例子:
val listOf = listOf<String>("Apple", "Banana", "Orange", "Pear", "Grape")
val obj = StringBuffer()
obj.append("Start eating fruits.\n")
for (s in listOf) {
obj.append(s).append("\n")
}
obj.append("Ate all fruits.")
val result = obj.toString()
println(result)
这样我们连续调用了很多次obj对象的方法。其实这个时候就可以考虑使用with函数来让代码变得精简:
val listOf = listOf<String>("Apple", "Banana", "Orange", "Pear", "Grape")
val result = with(StringBuffer()) {
append("Start eating fruits.\n")
for (s in listOf) {
append(s).append("\n")
}
append("Ate all fruits.")
toString()
}
Log.d("TAG", "initData: $result")2.run函数
run函数的用法和使用场景和上面with类似,只是稍微做了一些语法的改动。首先run函数通常不会直接调用,而是要在某个对象的基础上调用;其实run函数只接受一个Lambda参数,并且在Lambda表达式中提供调用对象的上下文。其它方面和with一样,包括也会使用Lambda表达式中的最后一行代码作为返回值返回。示例如下:
val result = obj.run {
//这里是obj的上下文
"value" //run函数的返回值
} val listOf = listOf<String>("Apple", "Banana", "Orange", "Pear", "Grape")
val result = StringBuffer().run {
append("Start eating fruits.\n")
for (s in listOf) {
append(s).append("\n")
}
append("Ate all fruits.")
toString()
}
Log.d("TAG", "initData: $result")总体来说,变化非常小,只是将with函数并传入StringBuffer对象改成了StringBuffer对象的run方法,其它没有任何区别,这两段代码执行的结果也是一样的。
3.apply函数
apply函数和run函数也是及其类似,都是要在某个对象上调用,并且只接受一个Lambda参数,也会在Lambda表达式中提供对象的上下文,但是apply函数无法定义返回值,而是会自动返回调用对象本身,示例代码如下:
val result = obj.apply {
//这里是obj的上下文
}
//result == obj现在我们再使用apply函数修改一下吃水果这段代码 , 如下:
val listOf = listOf<String>("Apple", "Banana", "Orange", "Pear", "Grape")
val result = StringBuffer().apply {
append("Start eating fruits.\n")
for (s in listOf) {
append(s).append("\n")
}
append("Ate all fruits.")
}
Log.d("TAG", "initData: ${result.toString()}")
由于apply函数无法定义返回值,只能返回调用对象本身,因此这里result实际上是一个StringBuffer对象,所以在最后打印的时候还要再调用它的toSting()方法才行。
边栏推荐
- 一个网络安全小白鼠的学习之路——nmap的基本使用
- web渗透必玩的靶场——DVWA靶场 1(centos8.2+phpstudy安装环境)
- 二舅为什么能刷屏?这三件事对企业公关的启示
- 考(重点理解哪些属于其他货币资金)、其他货币资金的内容、其他货币资金的账务处理(银行汇票存款、银行本票存款、信用卡存款、信用证保证金存款、存出投资款、外埠存款)
- Smart Tips for Frida Scripting in Kali Environment
- SGDP(2)——声纳寻宝游戏
- 对账、结账、错账更正方法、划线更正法、红字更正法、补充登记法
- Praying: 1 vulnhub walkthrough
- php的curl函数模拟post数据提交,速度非常慢
- 最简单的FRP内网穿透教程
猜你喜欢

Microsoft Office安装全过程记录

ES6 three-dot operator, array method, string extension method

File upload vulnerability

laravel 写api接口时 session获取不到处理办法

Syncthing文件同步方案完全攻略(亲测有效)

重点考:金融资产概述、交易性金融资产的概念、交易性金融资产的账务处理(取得、持有。出售)、

CTF introductory notes ping

【一句话攻略】彻底理解JS中的回调(Callback)函数

元宇宙:为何互联网大佬纷纷涉足?元宇宙跟NFT是什么关系?

文件包含漏洞
随机推荐
广告电商「私域打工人」职业前景:你离月薪6万,还差多远?
Syncthing文件同步方案完全攻略(亲测有效)
【一句话攻略】彻底理解JS中的回调(Callback)函数
Laravel打印执行的SQL语句
库存现金、现金管理制度、现金的账务处理、银行存款、银行存款的账务处理、银行存款的核对
The CTF introduction of PHP file contains
How to log in to Alibaba Cloud server using the admin account
php中魔术方法详解
解决flex布局warp自动换行下最后一行居中问题
web安全之目录遍历
聊聊MySQL的10大经典错误
Anaconda报错:An unexpected error has occurred. Conda has prepared the above report 解决办法
同态加密:CKKS原理之旋转(Rotation)
Smart Tips for Frida Scripting in Kali Environment
对账、结账、错账更正方法、划线更正法、红字更正法、补充登记法
Google Hacking
PHP hash加密与解密
Solve the problem that the 5+APP real machine test cannot access the background (same local area network)
Orasi: 1 vulnhub walkthrough
清理c盘爆满告急,C盘清理