当前位置:首页
> .html
导读:
最近在面试,我自认为kotlin用的还比较熟练,但竟然被一个问题问倒了,感觉有点失败,事后翻了下笔记,特此记录一下。
面试官:你说你kotlin用的贼6,那说下with、let...
最近在面试,我自认为kotlin用的还比较熟练,但竟然被一个问题问倒了,感觉有点失败,事后翻了下笔记,特此记录一下。
面试官:你说你kotlin用的贼6,那说下with、let、run、apply、also的区别?
我:嗯...,要不你还是换个问题吧?
面试官:出门右拐,把门带上。
回到家赶紧复习下,简单说下它们的区别。
with
特点:
- 传入参数为this,可以直接调用this的属性和函数;
- 返回值可以是任意类型;
缺点:
- 不支持非null检验;
- 不支持链式调用;
示例如下:

with函数
源码如下:
@kotlin.internal.InlineOnly
public 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.InlineOnly
public 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.InlineOnly
public 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.InlineOnly
public 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标准函数
发表评论: