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)
以上就是常用标准函数了。