阅读 77

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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐