标准函数with、run和apply

标准函数with、run和apply

with

with函数接收两个参数:第一个参数可以是一个任意类型的对象,第二个参数是一个Lambda表达式。with函数会在Lambda表达式中提供第一个参数对象的上下文,并使用Lambda表达式中的最后一行代码作为返回值返回。

示例代码如下:

val result = with(obj) {
      // 这里是obj的上下文
      "value" // with函数的返回值
}

run

run函数的用法和使用场景其实和with函数是非常类似的,只是稍微做了一些语法改动而已。首先run函数是不能直接调用的,而是一定要调用某个对象的run函数才行;其次run函数只接收一个Lambda参数,并且会在Lambda表达式中提供调用对象的上下文。其他方面和with函数是一样的,包括也会使用Lambda表达式中的最后一行代码作为返回值返回。

示例代码如下:

val result = obj.run {
      // 这里是obj的上下文
      "value" // run函数的返回值
}

apply

apply函数和run函数也是极其类似的,都是要在某个对象上调用,并且只接收一个Lambda参数,也会在Lambda表达式中提供调用对象的上下文,但是apply函数无法指定返回值,而是会自动返回调用对象本身。

示例代码如下:

val result = obj.apply {
      // 这里是obj的上下文
}
// result == obj

具体应用

比如有一个水果列表,现在我们想吃水果,并将结果打印出来,就可以这样写:

val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
val builder = StringBuilder()
builder.append("Start eating fruits.\n")
for(fruit in list){
    builder.append(fruit).append("\n")
}
builder.append("Ate all fruits.")
val result = builder.toString()
println(result)

这段代码逻辑很简单,就是使用StringBuilder来构建吃水果的字符串,最后将结果打印出来。运行结果如下:Snipaste_2021-01-04_10-20-42

with

仔细观察上述代码,你会发现我们连续调用了很多次builder对象的方法。其实这个事后可以考虑使用with函数来让代码变得更加精简,如下示例:

val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
val result = with(StringBuilder()){
    append("Start eating fruits.\n")
    for(fruit in list){
        append(fruit).append("\n")
    }
    append("Ate all fruits.")
    toString()
}
println(result)

首先我们给with函数第一个参数传入一个StringBuilder对象,那么接下来整个Lambda表达式的上下文就会是这个StringBuilder对象。于是我们调用builder.append()和,builder.toString()方法时就可以直接调用append()和toString()了。

run

接下来我们用run函数来实现下这个方法

val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
val result =StringBuilder().run{
    append("Start eating fruits.\n")
    for(fruit in list){
        append(fruit).append("\n")
    }
    append("Ate all fruits.")
    toString()
}
println(result)

总体的变化非常小,只是Run函数是一定要调用某个对象的run函数才行,且run函数只接受一个Lambda参数

apply

接下来是apply

val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
val result =StringBuilder().apply{
    append("Start eating fruits.\n")
    for(fruit in list){
        append(fruit).append("\n")
    }
    append("Ate all fruits.")
}
println(result.toString())

n list){
append(fruit).append("\n")
}
append(“Ate all fruits.”)
}
println(result.toString())


由于apply函数无法指定返回值,只能返回调用对象本身,因此这里的result实际上是一个StringBuilder对象,所以我们最后在打印是要调用它的toString()方法才行。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值