Kotlin基础学习 --- 内置函数apply、let

apply内置函数

fun main(){
    val buffer = "i am buffer "
    //常规方式
    println("buffer的字符长度是:${buffer.length}")
    println("buffer的第一个字符是:${buffer.first()}")
    println("buffer全部转化为大写:${buffer.toUpperCase()}")

    //apply方式
    //使用apply方式时,xxx.apply 在匿名函数体中会持有一个this == xxx本身
    //apply内置函数会存在返回值,始终返回xxx本身,就可以一直链式调用
    //在apply中this可以省略
    buffer.apply {
        println("buffer的字符长度是:${length}")
    }.apply {
        println("buffer的第一个字符是:${first()}")
    }.apply {
        println("buffer全部转化为大写:${toUpperCase()}")
    }
}

这段代码的运行结果:
Kotlin基础学习 --- 内置函数apply、let_第1张图片

接下来看一下apply

@kotlin.internal.InlineOnly
public inline fun <T> T.apply(block: T.() -> Unit): T {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    block()
    return this
    //上述代码可以看出来,apply是扩展了所有的泛型对象 且最后return this
}

let内置函数

	//let内置函数Lambda表达式的会持有一个it == list本身
	//并且将Lambda表达式中最后一行作为返回值
    val list : List<Int> = listOf(1,2,3,4,5)
    val result = list.let {
        it.first()+it.first()
    }
    println("result :${result}")
使用let函数对值判null并返回
fun main(){
    println(get(null))
    println(get("angle"))
}

fun get( info : String?) : String{
    return info?.let {
       "info is $info"
    } ?: "info is null"
}

info is null
info is angle

总结
info.apply
1. apply函数返回值永远是 info本身
2. apply函数的匿名函数体 { 持有的是 this == 调用者本身}
info.let
1. let函数的返回值是根据匿名函数最后一行的变化而变化
2. let函数的匿名函数题 { 持有的是 it == 调用者本身}

你可能感兴趣的:(kotlin,学习)