Kotlin中的let、with、also、run、apply

2021-06-18  本文已影响0人  盛世光阴

前言

Kotlin是一种在Java虚拟机上运行的静态类型编程语言,被称之为Android世界的Swift,在GoogleI/O2017中,Google宣布Kotlin成为Android官方开发语言

作用域函数使我们很频繁使用的函数,它的作用是形成一个特定对象的作用域,可以简化我们的代码逻辑,提高开发效率

let

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

顶层函数,返回值为lambda表达式的执行结果
常用方式: 非空对象执行代码块,使用it引用对象

context?.let {
    //当context不为null是执行此代码块
    addView(TextView(it))
    addView(ImageView(it))
}

with

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

顶层函数,返回值为lambda表达式的执行结果
常用方式,用于 一组对象的连续调用,使用this引用对象

service.setModel("None")
service.setLogLevel(LogLevel.E)
service.init(ID)
//使用with
with(service){
    setModel("None")
    service.setLogLevel(LogLevel.E)
    service.init(ID)
}

also

public inline fun <T> T.also(block: (T) -> Unit): T {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    block(this)
    return this
}

顶层函数,返回值为当前调用对象
常用方式,用于对象的 附加操作,使用it引用对象

fun getResposne(){
    ...
    return response.also{
        Log.e("mike","--$it--")
    }
}

apply

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

顶层函数,返回值为当前调用对象
常用方式,用于对象的 配置,使用this引用对象

fun getResposne(){
    ...
    return response.apply{
        code = 200
        value = "Success!"
    }
}

总结

let作用域内操作对象为it,返回lambda表达式的执行结果,主要用于对象判空的场景
with作用域内操作对象为this,返回lambda表达式的执行结果,主要用于一组连续对象调用的场景
also作用域内操作对象为it,返回当前对象,主要用于执行附加操作的场景
apply作用域内操作对象为this,返回当前对象,主要用于对象的配置场景

注意事项

val status = 1
if (status == 1) {
    Log.e("mike", "--one--")
} else if (status == 2) {
    Log.e("mike", "--two--")
} else {
    Log.e("mike", "--else--")
}
//结果打印 one
if (status == 1) {
    "one"
} else if (status == 2) {
    "two"
} else {
    "else"
}.let {
    Log.e("mike", "--$it--")
}
//结果没有日志输出

欢迎关注Mike的简书

Android知识整理

上一篇下一篇

猜你喜欢

热点阅读