Kotlin 系列之let、with、run、apply标准函数解析

 

Kotlin 中的标准函数指的是在 Standard.kt 中定义的函数,然后我就来写一下我经常会用到的标准函数,顺便做过总结。

 

let

kotlin 为了空安全不允许定义为空的,想要定义的话就必须加上问号,但是在实际编码中,有好多情况就好像下面的代码一样

mVideoPlayer?.setVideoView(activity.course_video_view)
mVideoPlayer?.setControllerView(activity.course_video_controller_view)
mVideoPlayer?.setCurtainView(activity.course_video_curtain_view)

写的时候感觉特别烦人,老是要进行判断,其实可以写成这样。

mVideoPlayer?.let {
       it.setVideoView(activity.course_video_view)
       it.setControllerView(activity.course_video_controller_view)
       it.setCurtainView(activity.course_video_curtain_view)
}

并且还可以用 it 指代 mVideoPlayer,这样不就方便很多了?在这里,let操作符的作用:当时用符号?.验证的时候忽略掉null。

使用场景:使用 let 函数去处理一个可能为 null 的对象统一做判空处理。

 

with

它是将某个对象作为函数的参数,在函数块内可以通过 this 来指代这个对象,返回值为函数块的最后一行或者指定的 return 表达式。

 

在函数底层,可以看出with函数是接收了两个参数,分别为T类型的对象 receiver 和一个 lambda 函数块

public inline fun <T, R> with(receiver: T, block: T.() -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return receiver.block()
}

所以 with 函数最原始样子应该是这样写的:

val result = with(user, {
        println("my name is $name, I am $age years old, my phone number is $phoneNum")
        1000
    })

但是由于with函数最后一个参数是一个函数,可以把函数提到圆括号的外部,看起来会更加简洁。

fun main(args: Array<String>) {
    val user = User("Kotlin", 1, "1111111")


    val result = with(user) {
        println("my name is $name, I am $age years old, my phone number is $phoneNum")
        1000
    }
    println("result: $result")
}

然后我们使用的结构一般是:

 with(object){
   //todo
 }

使用场景:适用于调用同一个类的多个方法的时候,可以不用去重复写类名,直接调用类的方法就可以了。比如说,可以用在RecyclerView中onBinderViewHolder中。

 

run

这个标准函数的作用其实和 with 基本一致,只是使用方法上有一点不同,with 是需要括号中写入对象来进行操作,run 则是直接对对象进行操作。

在函数底层,run 函数是这样的,返回最后一行

public inline fun <T, R> T.run(block: T.() -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return block()
}

上述代码重写应该是这样:

val result = user().run {
        println("my name is $name, I am $age years old, my phone number is $phoneNum")
        1000
    }

使用场景:适用于 let, with 函数任何场景,因为 run 函数是 let, with 两个函数结合体

 

apply

在 Standard.kt 里,apply 函数是这样的

public inline fun <T> T.apply(block: T.() -> Unit): T {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    block()
    return this
}

跟 run 不一样的是,最后一行不作为返回值,返回的是一个对象(this)

 

以上就是常用标准函数了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值