0
点赞
收藏
分享

微信扫一扫

kotlin标准函数-with、let、run、apply、also

颜路在路上 2021-09-18 阅读 66
kotlin

面试官:你说你kotlin用的贼6,那说下with、let、run、apply、also的区别?
我:嗯...,要不你还是换个问题吧?
面试官:出门右拐,把门带上。

回到家赶紧复习下,简单说下它们的区别。

with

特点:

  • 传入参数为this,可以直接调用this的属性和函数;
  • 返回值可以是任意类型;

缺点:

  • 不支持非null检验;
  • 不支持链式调用;

示例如下:

源码如下:

@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来调用属性和函数;
  • 返回值可以是任意类型,且支持链式调用;

示例如下:

源码如下:

@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函数的优点;

示例如下:



源码如下:

@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自身类型,最后一个值不会返回;

示例如下:



源码如下:

@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自身类型,最后一个值不会返回;

示例如下:



源码如下:

@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
}

最后,用一张图进行总结,如下:


举报

相关推荐

0 条评论