当前位置:网站首页>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()方法才行。
边栏推荐
- The first time to tear the code by hand, how to solve the problem of full arrangement
- php中魔术方法详解
- Smart Tips for Frida Scripting in Kali Environment
- 利用cookie获取admin权限 CTF基础题
- 库存现金、现金管理制度、现金的账务处理、银行存款、银行存款的账务处理、银行存款的核对
- The roll call system and array elements find maximum and minimum values for sorting of objects
- Shuriken: 1 vulnhub walkthrough
- DNS详解
- 学IT,找工作——反转链表
- Orasi: 1 vulnhub walkthrough
猜你喜欢
随机推荐
PALISADE:CKKS的使用
清理c盘爆满告急,C盘清理
(6) Design of student information management system
元宇宙是一个炒作的科幻概念,还是互联网发展的下半场?
File upload vulnerability
The CTF introductory notes of SQL injection
3000字入门图神经网络
PHP hash加密与解密
CTF entry md5
2022年中高级 Android 大厂面试秘籍,为你保驾护航金九银十,直通大厂
SATA M2 SSD 无法安装系统的解决方法
英语每日打卡
ES6 array extension methods map, filter, reduce, fill and array traversal for…in for…of arr.forEach
库存现金、现金管理制度、现金的账务处理、银行存款、银行存款的账务处理、银行存款的核对
Orasi: 1 vulnhub walkthrough
CTF-网鼎杯往届题目
【一句话攻略】彻底理解JS中的回调(Callback)函数
CTF introductory notes ping
考(重点理解哪些属于其他货币资金)、其他货币资金的内容、其他货币资金的账务处理(银行汇票存款、银行本票存款、信用卡存款、信用证保证金存款、存出投资款、外埠存款)
对账、结账、错账更正方法、划线更正法、红字更正法、补充登记法









