当前位置:网站首页>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()方法才行。
边栏推荐
- (1) the print () function, escape character, binary and character encoding, variables, data type, the input () function, operator
- 二舅为什么能刷屏?这三件事对企业公关的启示
- [Hello World教程] 使用HBuilder和Uni-app 生成一个简单的微信小程序DEMO
- Dcat Admin 关闭代码生成器 登录指定地址
- 【泰山众筹】模式为什么一直都这么火热?是有原因的
- 解密:链动2+1的商业模式
- 重点考:从债劵的角度来看交易性金融资产
- 文件包含漏洞
- (4) Function, Bug, Class and Object, Encapsulation, Inheritance, Polymorphism, Copy
- A code audit notes (CVE - 2018-12613 phpmyadmin file contains loopholes)
猜你喜欢

file contains vulnerabilities

A network security guinea pig's learning path - scripting of advanced usage of nmap

Larave 自定义公共函数以及引入使用

The CTF introductory notes of SQL injection

File upload vulnerability

面试知识点整理:Skia 架构的场景渲染

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

利用cookie获取admin权限 CTF基础题

OpenCore 黑苹果安装教程

(1) the print () function, escape character, binary and character encoding, variables, data type, the input () function, operator
随机推荐
Command Execution Vulnerability
考(重点理解哪些属于其他货币资金)、其他货币资金的内容、其他货币资金的账务处理(银行汇票存款、银行本票存款、信用卡存款、信用证保证金存款、存出投资款、外埠存款)
C language uses stack to calculate infix expressions
Cookie is used to collect the admin privileges CTF foundation problem
SGDP(1)——猜数字游戏
Dcat Admin 关闭代码生成器 登录指定地址
二舅为什么能刷屏?这三件事对企业公关的启示
OpenCore 黑苹果安装教程
Larave 自定义公共函数以及引入使用
laravel 写api接口时 session获取不到处理办法
(2) Sequence structures, Boolean values of objects, selection structures, loop structures, lists, dictionaries, tuples, sets
快速搭建一个网关服务,动态路由、鉴权的流程,看完秒会(含流程图)
cmake安装到指定目录
(3) string
web渗透必玩的靶场——DVWA靶场 1(centos8.2+phpstudy安装环境)
php laravel框架生成二维码
借贷记账法下的账户结构、借贷记账法的记账规则、借贷记账法下的账户对应关系与会计分录
GreenOptic: 1 vulnhub walkthrough
Debian 12 Bookworm 尝鲜记
重点考:金融资产概述、交易性金融资产的概念、交易性金融资产的账务处理(取得、持有。出售)、