美文网首页
Kotlin中的let、with、also、run、apply

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

作者: 盛世光阴 | 来源:发表于2021-06-18 23:05 被阅读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知识整理

    相关文章

      网友评论

          本文标题:Kotlin中的let、with、also、run、apply

          本文链接:https://www.haomeiwen.com/subject/bbylyltx.html