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)的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin——高级篇:高阶函数详解与标准的高阶函数使用

Kotlin标准函数

Kotlin——基础的函数/方法详解

Kotlin学习与实践 基础

Kotlin之高阶函数

Kotlin 初学者标准函数