申明:要了解它们的特性的最好方法就是翻源码。源码里写的很简单,不必弄得很复杂。
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)
}
}