Kotlin之标准函数的学习讲解(withapply)
Posted CodeJiao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin之标准函数的学习讲解(withapply)相关的知识,希望对你有一定的参考价值。
1.Kotlin小课堂: 标准函数
Kotlin标准函数指的是Standard.kt文件中定义的函数,
任何Kotlin代码都可以自由的调用标准函数.
1.1 with
我们先从with函数学起,with函数接收两个参数,第一个参数可以是
任意类型的对象,第二个参数是Lambda表达式.
with函数会在Lambda表达式中提供第一个参数对象的上下文,
并使用Lambda表达式中最后一行代码作为返回值返回.示例:
val result= with(obj)
// 这里是obj的上下文
"value" //with函数的返回值
那么这个函数有什么作用呢?
它可以在连续调用同一个对象的多个方法时让代码变得更加简洁,比如:
现在有一个水果列表,我们想吃完所有的水果,并且将结果打印出来,可以这样写:
fun main()
val list = listOf("Apple", "Orange", "Banana", "Grape", "Pear")
val builder = StringBuilder()
builder.append("Start eating fruits.\\n")
for (fruit in list)
builder.append(fruit + "\\n")
builder.append("Ate all fruits.")
val result = builder.toString()
println(result)
运行结果:
不难看出,我们连续调用了多次builder对象的方法,
其实这个时候就可以考虑使用with函数来使得代码变得更加精简.
fun main()
val list = listOf("Apple", "Orange", "Banana", "Grape", "Pear")
val result = with(StringBuilder())
append("Start eating fruits.\\n")
for (fruit in list)
append(fruit + "\\n")
append("Ate all fruits.")
// 最后一行代码作为with函数的返回值
toString()
println(result)
运行结果:
这一段代码咋一看可能比较迷惑,但其实很好理解.
首先我们给with函数的第一个参数传入了一个StringBuilder对象,
那么接下来整个Lambda表达式的上下文都会是StringBuilder对象,
于是我们在Lambda表达式中就不用像刚才那样调用
builder.append(fruit + "\\n")方法和builder.toString()了,
而是可以直接调用append(fruit + "\\n")和toString()方法.
Lambda表达式的最后一行代码会作为函数的返回值返回.
那么我们现在就可以使用run函数来修改一下吃水果的这段代码,如下所示:
fun main()
val list = listOf("Apple", "Orange", "Banana", "Grape", "Pear")
val result=StringBuilder().run
append("Start eating fruits.\\n")
for (fruit in list)
append(fruit + "\\n")
append("Ate all fruits.")
// 最后一行代码作为with函数的返回值
toString()
println(result)
这里只是将调用with函数并且传入StringBuilder对象改成了
StringBuilder对象的run方法,其他地方都没有改动,
这两段代码最终的执行结果是一样的.
1.2 apply函数
apply函数和with函数是极其相似的,都是要在某个对象上面调用,
并且只接收一个Lambda表达式作为参数,
也会在Lambda表达式中提供调用对象的上下文,
但是apply函数无法指定返回值,而是自动返回调用对象本身.示例:
val result = obj.apply
// 这里是obj的上下文
//result==obj
那么我们现在再来使用apply函数来修改一下吃水果这段代码:
fun main()
val list = listOf("Apple", "Orange", "Banana", "Grape", "Pear")
val result = StringBuilder().apply
append("Start eating fruits.\\n")
for (fruit in list)
append(fruit + "\\n")
append("Ate all fruits.")
println(result.toString())
运行结果:
这里注意代码的变化,由于apply函数无法指定返回值,
所以这个函数的返回值实际上是一个StringBuilder对象.
如果我们要在启动活动的时候传递数据,我们可以这么写:
val intent = Intent(context, SecondActivity::class.java)
intent.putExtra("param1", "data1")
intent.putExtra("param2", "data2")
context.startActivity(intent)
这里每传递一个参数都要调用一次intent.putExtra()方法,
如果要传递100个参数,就要调用100次.所以针对这种情况,
我们就可以使用apply函数来进行简化
val intent = Intent(context, SecondActivity::class.java).apply
putExtra("param1", "data1")
putExtra("param2", "data2")
context.startActivity(intent)
可以看见,由于Lambda表达式中的上下文就是Intent对象,
所以我们不在需要调用intent.putExtra()方法,而是直接调用putExtra()方法.
传递的参数越多,这种写法的优势就会越明显.
以上是关于Kotlin之标准函数的学习讲解(withapply)的主要内容,如果未能解决你的问题,请参考以下文章