当前位置:网站首页>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
- 对账、结账、错账更正方法、划线更正法、红字更正法、补充登记法
- 如何在正则表达式里表达可能存在也可能不存在的内容?
- 管理会计(对内)指引、管理会计要素及其具体内容(可能考,考前记一下,推荐记一下四个大点即可)、
- Eric target penetration test complete tutorial
- 在 UUP dump 被墙的情况下如何用 UUP 下载 ISO 镜像
- php中魔术方法详解
- Solve the problem that the 5+APP real machine test cannot access the background (same local area network)
- Praying: 1 vulnhub walkthrough
- 成本会计的概念、产品成本核算的要求、产品成本核算的对象与成本项目、产品成本的归集和分配(可能考判断)、产品成本计算方法 (三种:产品的品种(品种法),批次(分批法),步骤(分步法))
猜你喜欢
如何在正则表达式里表达可能存在也可能不存在的内容?
阿里技术官手码12W字面试小册
【泰山众筹】模式为什么一直都这么火热?是有原因的
The roll call system and array elements find maximum and minimum values for sorting of objects
一个网络安全小白鼠的学习之路—nmap高级用法之脚本使用
uniapp | Compilation error after updating with npm update
文件包含漏洞
CTF-Neting Cup Past Topics
laravel 查询数据库获取结果如何判断是否为空?
laravel-admin 线上访问项目,一直重定向到登录页面
随机推荐
CTF入门笔记之SQL注入
uniapp | Problems with the use of the official map component
php函数漏洞总结
会计凭证概述、原始凭证、原始凭证的种类、原始凭证的基本内容、原始凭证的填制要求、原始凭证的审核
命令执行漏洞
CTF entry md5
动力:2 vulnhub预排
(5) Modules and packages, encoding formats, file operations, directory operations
学IT,找工作——移除链表元素
一次代码审计的笔记(CVE-2018-12613 phpmyadmin文件包含漏洞)
成本会计的概念、产品成本核算的要求、产品成本核算的对象与成本项目、产品成本的归集和分配(可能考判断)、产品成本计算方法 (三种:产品的品种(品种法),批次(分批法),步骤(分步法))
Go Build报错汇总(持续更新)
管理会计(对内)指引、管理会计要素及其具体内容(可能考,考前记一下,推荐记一下四个大点即可)、
加密数字货币前传:从大卫·乔姆到中本聪
CSRF(跨站请求伪造)
(2) Sequence structures, Boolean values of objects, selection structures, loop structures, lists, dictionaries, tuples, sets
2021-09-04 最简单的Golang定时器应用以及最简单的协程入门儿
一个网络安全小白鼠的学习之路—nmap高级用法之脚本使用
PHP realizes the automatic reverse search prompt of the search box
After Alibaba Cloud sets up domain name resolution redirection, I cannot use Chrome to access it