kotlin函数let,run,with,apply,also的区别

申明:要了解它们的特性的最好方法就是翻源码。源码里写的很简单,不必弄得很复杂。

block:T.()这种的代码写法例子如下:
"xxx".run{length}//length是"xxx".length的意思,
block:(T)这种的代码写法例子:
"XXX".let{it->it.length}//需要写it或者其他符号代表"XXX"

1、let的源代码:返回值是执行代码块的最后一行,且block中需要通过“对象.属性/方法”的形式调用。

@kotlin.internal.InlineOnly
public inline fun <T, R> T.let(block: (T) -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return block(this)
}

2、run的源代码:返回值是执行代码的最后一行。block: T.()即block中可以直接调用自身属性方法。

@kotlin.internal.InlineOnly
public inline fun <T, R> T.run(block: T.() -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return block()
}

3、with的源代码:需要一个不为空的对象,且block中可以直接调用该对象的属性、方法,返回值为block的最后一行。

@kotlin.internal.InlineOnly
public inline fun <T, R> with(receiver: T, block: T.() -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return receiver.block()
}

4、apply的源代码:block中可以直接调用该对象的属性、方法,返回值为对象本身。

@kotlin.internal.InlineOnly
public inline fun <T> T.apply(block: T.() -> Unit): T {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    block()
    return this
}

5、kotlin1.1以后的新的特性扩展函数

also的源代码:返回对象本身,block需要lambda表达式。

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

takeIf源代码:如果predicate返回值为true,则返回自身,否则返回null。predicate可直接调用对象的属性、方法。

@kotlin.internal.InlineOnly
@SinceKotlin("1.1")
public inline fun <T> T.takeIf(predicate: (T) -> Boolean): T? {
    contract {
        callsInPlace(predicate, InvocationKind.EXACTLY_ONCE)
    }
    return if (predicate(this)) this else null
}

takeUnless源代码:如果predicate返回值为false,则返回自身,否则返回null。predicate可直接调用对象的属性、方法。

@kotlin.internal.InlineOnly
@SinceKotlin("1.1")
public inline fun <T> T.takeUnless(predicate: (T) -> Boolean): T? {
    contract {
        callsInPlace(predicate, InvocationKind.EXACTLY_ONCE)
    }
    return if (!predicate(this)) this else null
}

repeat源代码:重复执行

@kotlin.internal.InlineOnly
public inline fun repeat(times: Int, action: (Int) -> Unit) {
    contract { callsInPlace(action) }

    for (index in 0 until times) {
        action(index)
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值