kotlin标准函数-with、let、run、apply、also
最近在面试,我自认为kotlin用的还比较熟练,但竟然被一个问题问倒了,感觉有点失败,事后翻了下笔记,特此记录一下。
面试官:你说你kotlin用的贼6,那说下with、let、run、apply、also的区别?
我:嗯...,要不你还是换个问题吧?
面试官:出门右拐,把门带上。
回到家赶紧复习下,简单说下它们的区别。
with
特点:
传入参数为this,可以直接调用this的属性和函数;
返回值可以是任意类型;
缺点:
不支持非null检验;
不支持链式调用;
示例如下:
with函数
源码如下:
@kotlin.internal.InlineOnlypublic inline fun <T, R> with(receiver: T, block: T.() -> R): R { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } return receiver.block()}
let
特点:
可以在表达式执行前进行非null检验;
传入参数为it,需要用it来调用属性和函数;
返回值可以是任意类型,且支持链式调用;
示例如下:
let函数
源码如下:
@kotlin.internal.InlineOnlypublic inline fun <T, R> T.let(block: (T) -> R): R { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } return block(this)}
run
特点:
可以在表达式执行前进行非null效验;
传入参数为this,可以直接调用this的属性和函数
返回值为任意类型,且支持链式调用
可以说是结合了with和let函数的优点;
示例如下:
run函数
源码如下:
@kotlin.internal.InlineOnlypublic inline fun <T, R> T.run(block: T.() -> R): R { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } return block()}
apply
特点:
可以在表达式执行前进行非null校验;
传入参数为this;
返回值固定为this自身类型,最后一个值不会返回;
示例如下:
apply函数
源码如下:
@kotlin.internal.InlineOnlypublic inline fun <T> T.apply(block: T.() -> Unit): T { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } block() return this}
also
特点:
可以在表达式执行前进行非null校验;
传入参数为it;
返回值固定为this自身类型,最后一个值不会返回;
示例如下:
also函数
源码如下:
@kotlin.internal.InlineOnly@SinceKotlin("1.1")public inline fun <T> T.also(block: (T) -> Unit): T { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } block(this) return this}
最后,用一张图进行总结,如下:
kotlin标准函数
作者:MIRROR1217
链接:https://www.jianshu.com/p/1664a858d127
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。