Kotlin之“with”函数和“apply”函数

“with”函数

要想了解"with"函数先来看一段代码

  fun alphabet(): String {
        var stringBuilder = StringBuilder()

        for (letter in 'A'..'Z') {
            stringBuilder.append(letter)
        }
        stringBuilder.append("\n Now I know the alphabet!")
        return stringBuilder.toString()
    }

    fun alphabetWith(): String {
        var stringBuilder = StringBuilder()
        return with(stringBuilder) {
            for (letter in 'A'..'Z') {
                this.append(letter)  //this代表stringBuilder
            }
            this.append("\n Now I know the alphabet")
            this.toString()
        }
    }
复制代码

运行结果

08-26 15:20:58.516 24082-24082/com.troll4it.kotlindemo I/System.out: alphabet: ABCDEFGHIJKLMNOPQRSTUVWXYZ
08-26 15:20:58.517 24082-24082/com.troll4it.kotlindemo I/System.out:  Now I know the alphabet!
    alphabetWith:ABCDEFGHIJKLMNOPQRSTUVWXYZ
08-26 15:20:58.518 24082-24082/com.troll4it.kotlindemo I/System.out:  Now I konw the alphabet
复制代码

通过上面代码可以看出,运行结果一样,但是alphabet()是最常规的写法, alphabetWith()方法则运用了今天的重点讲解的函数with()函数

wtih结构看起来像一种特殊的语法结构,但它是一个接收两个参数的函数:参数分别是stringBuffer和一个lambda
with函数把它的第一个参数转换成第二个参数传给它的lambda的接收者,可以显示地通过this引用来访问这个接收者,但是上述方法alphabetWith()方法的this是可以省略的。
with返回的值是lambda代码的返回值结果

"apply"函数

同时想了解apply函数先看一段代码

  fun alphabetApply():String=StringBuffer().apply {
        for (letter in 'A'..'Z') {
         append(letter)
        }
       append("\n Now I know the alphabet")
    }.toString()
复制代码

执行结果:


08-26 15:50:48.888 25155-25155/com.troll4it.kotlindemo I/System.out: alphabetApply:ABCDEFGHIJKLMNOPQRSTUVWXYZ
08-26 15:50:48.889 25155-25155/com.troll4it.kotlindemo I/System.out:  Now I konw the alphabet

复制代码

apply被声明成一个扩展函数,它的接受者变成作为实参的lambda的接受者。执行apply的结果就是StringBuffer

总结:

  • with返回的值是执行lambda代码的结果,该结果是lambda中的最后一个表达式的值。
  • apply返回的值是lambda接受者的对象

后记

摘自《Kotlin实战》

转载于:https://juejin.im/post/5b825dd8518825430f3004af

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值