0
点赞
收藏
分享

微信扫一扫

Kotlin中apply,also,let,run函数详解与内部源码原理分析

爱读书的歌者 2022-02-09 阅读 35
1. let的返回类型是根据匿名函数的变化而变化(lambda的返回类型变化而变化)
2. 匿名函数里面持有的是 it == I == info本身
inline fun <I, O> I.let(lambda:(I) -> O) = lambda(this)

1. apply的返回类型永远都是I(所以可以链式调用), lambda的返回类型无变化即Unit,并且没有和lambda关联返回类型
2. I.()匿名扩展函数里面持有的是 this == I == info本身
inline fun <I> I.apply(lambda:I.() -> Unit):I{
   lambda()
   return this
 }
inline fun <R> run(block: () -> R): R {
    return block()
}
//inline fun <R> run(block: () -> R): R =  block()

inline fun <T, R> T.run(block: T.() -> R): R {
    return block()
}
//inline fun <T, R> T.run(block: T.() -> R): R = block()

inline fun <T, R> with(receiver: T, block: T.() -> R): R {
    return receiver.block()
}
//inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()

inline fun <T> T.apply(block: T.() -> Unit): T {
    block()
    return this
}

inline fun <T> T.also(block: (T) -> Unit): T {
    block(this)
    return this
}

public inline fun <T, R> T.let(block: (T) -> R): R {
    return block(this)
}
//inline fun <T, R> T.let(block: (T) -> R): R = block(this)

inline fun <T> T.takeIf(predicate: (T) -> Boolean): T? {
    return if (predicate(this)) this else null
}
//inline fun <T> T.takeIf(predicate: (T) -> Boolean): T? = if (predicate(this)) this else null

inline fun <T> T.takeUnless(predicate: (T) -> Boolean): T? {
    return if (!predicate(this)) this else null
}
//inline fun <T> T.takeUnless(predicate: (T) -> Boolean): T? = if (!predicate(this)) this else null


//inline 高阶函数使用内联对lambda进行优化处理提高性能
//fun <INPUT> 函数中声明一个泛型
//INPUT.mApply 让所有的类型都可以调用mApply扩展函数
//INPUT.() -> Unit 让我们的匿名扩展函数里面持有this
//在lambda里面不需要返回值,里面永远都是返回INPUT本身
private inline fun <INPUT> INPUT.mApply(lambda: INPUT.() -> Unit): INPUT {
    lambda()//this可以省略
    return this
}

/**
 * public inline fun <T> T.apply(block: T.() -> Unit): T {
 *      block()
 *      return this
 * }
 */

fun main() {
    val r: File = File("D:\\a.txt")
        .mApply {
            //输入的是 this == File对象本身
            this.setReadable(true)
            setWritable(true)
            println("1 ${readLines()}")
        }.mApply {
            //输入的是 this == File对象本身
            setReadable(true)
            setWritable(true)
            println("2 ${readLines()}")
        }
}
举报

相关推荐

0 条评论