Kotlin - 标准函数(with、run和apply)

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
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值