Kotlin let、with、run、apply、also函数的使用

    xiaoxiao2022-07-12  150

    let,with,run,apply,also 是内联扩展函数

    下面是自己使用的心的如果有错的地方希望给予指正谢谢

    这几个主要用来简化操作,使得代码可读性提高 ,下面列举项目中使用效果

    1 let 

     先不啰嗦了 直接代码吧 ,

    不是let  的代码

    val list = ArrayList<String>() list.add("A") list.add("B") list.add("C") for (i in list.indices) { println(list[i]) }

    使用let 之后如下

    val list = ArrayList<String>() list.let { it.add("A") it.add("B") it.add("C") } for (i in list.indices) { println(list[i]) Log.e("==============hly=======",list[i]) }

    他们对比发现list 没有反复的使用, 不过却有一个it 

    自己在项目中测试let也使用了

    没有使用let 如下 

    这个是刷新的地方, 估计很多人都在使用,是不是刷新的id要写2次

    class MainActivity : AppCompatActivity(), OnRefreshListener, OnLoadMoreListener { override fun onRefresh(refreshLayout: RefreshLayout) { } override fun onLoadMore(refreshLayout: RefreshLayout) { } @SuppressLint("LongLogTag") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) smart.setOnRefreshListener { this@MainActivity } smart.setOnLoadMoreListener { this@MainActivity }

    使用let如下

    class MainActivity : AppCompatActivity(), OnRefreshListener, OnLoadMoreListener { override fun onRefresh(refreshLayout: RefreshLayout) { } override fun onLoadMore(refreshLayout: RefreshLayout) { } @SuppressLint("LongLogTag") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) smart.let { it.setOnRefreshListener { this@MainActivity } it.setOnLoadMoreListener { this@MainActivity } }

    刚才是自己点击let看看源码

    /** * Calls the specified function [block] with `this` value as its argument and returns its result. */ @kotlin.internal.InlineOnly public inline fun <T, R> T.let(block: (T) -> R): R { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } return block(this) }

    百度翻译下 let 注释 

    以' this '值作为参数调用指定的函数[block]并返回其结果。

     

    2 with

    还是用刚才的list代码 用with 试试

    val list = ArrayList<String>() with(list){ add("A") add("B") add("C") } for (i in list.indices) { println(list[i]) Log.e("==============hly=======",list[i]) }

    这个写法和刚才的有很大差别是不是

    在使用with 实现刷新

    class MainActivity : AppCompatActivity(), OnRefreshListener, OnLoadMoreListener { override fun onRefresh(refreshLayout: RefreshLayout) { } override fun onLoadMore(refreshLayout: RefreshLayout) { } @SuppressLint("LongLogTag") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) //原始的 smart.setOnRefreshListener { this@MainActivity } smart.setOnLoadMoreListener { this@MainActivity } //let smart.let { it.setOnRefreshListener { this@MainActivity } it.setOnLoadMoreListener { this@MainActivity } } //with with(smart) { setOnRefreshListener { this@MainActivity } setOnLoadMoreListener { this@MainActivity } }

     

    with 的源码

     

    /** * Calls the specified function [block] with the given [receiver] as its receiver and returns its result. */ @kotlin.internal.InlineOnly public inline fun <T, R> with(receiver: T, block: T.() -> R): R { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } return receiver.block() }

    翻译下with的注释:

    使用给定的[receiver]调用指定的函数[block]并返回其结果。

     

    3 run 

    使用刚才的list 如下

    val list = ArrayList<String>() list.run { add("A") add("B") add("C") } for (i in list.indices) { println(list[i]) Log.e("==============hly=======", list[i]) }

    在写一些刷新看看

    class MainActivity : AppCompatActivity(), OnRefreshListener, OnLoadMoreListener { override fun onRefresh(refreshLayout: RefreshLayout) { } override fun onLoadMore(refreshLayout: RefreshLayout) { } @SuppressLint("LongLogTag") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) //原始的 smart.setOnRefreshListener { this@MainActivity } smart.setOnLoadMoreListener { this@MainActivity } //let smart.let { it.setOnRefreshListener { this@MainActivity } it.setOnLoadMoreListener { this@MainActivity } } //with with(smart) { setOnRefreshListener { this@MainActivity } setOnLoadMoreListener { this@MainActivity } } //run smart.run { setOnRefreshListener { this@MainActivity } setOnLoadMoreListener { this@MainActivity } }

     

    这些我没把let ,with 去掉方便大家对比查看,实现的效果是一样的

     

    run的源码

    /** * Calls the specified function [block] with `this` value as its receiver and returns its result. */ @kotlin.internal.InlineOnly public inline fun <T, R> T.run(block: T.() -> R): R { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } return block() }

    翻译注释

    调用指定的函数[block],并以' this '值作为其接收方,返回其结果。

    4 apply

    刚开的list 使用apply 如下

    val list = ArrayList<String>() list.apply { add("A") add("B") add("C") } for (i in list.indices) { println(list[i]) Log.e("==============hly=======", list[i]) }

    apply 实现的刷新 如下

    class MainActivity : AppCompatActivity(), OnRefreshListener, OnLoadMoreListener { override fun onRefresh(refreshLayout: RefreshLayout) { } override fun onLoadMore(refreshLayout: RefreshLayout) { } @SuppressLint("LongLogTag") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) //原始的 smart.setOnRefreshListener { this@MainActivity } smart.setOnLoadMoreListener { this@MainActivity } //let smart.let { it.setOnRefreshListener { this@MainActivity } it.setOnLoadMoreListener { this@MainActivity } } //with with(smart) { setOnRefreshListener { this@MainActivity } setOnLoadMoreListener { this@MainActivity } } //run smart.run { setOnRefreshListener { this@MainActivity } setOnLoadMoreListener { this@MainActivity } } //apply smart.apply{ setOnRefreshListener { this@MainActivity } setOnLoadMoreListener { this@MainActivity } }

    apply的源码

    /** * Calls the specified function [block] with `this` value as its receiver and returns `this` value. */ @kotlin.internal.InlineOnly public inline fun <T> T.apply(block: T.() -> Unit): T { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } block() return this }

    翻译注释

    调用指定的函数[block],并将' this '值作为其接收器,返回' this '值。

    5 also

    使用刚才的list also 的使用如下

    val list = ArrayList<String>() list.also { it.add("A") it.add("B") it.add("C") } for (i in list.indices) { println(list[i]) Log.e("==============hly=======", list[i]) }

     

    also 的刷新如下

    class MainActivity : AppCompatActivity(), OnRefreshListener, OnLoadMoreListener { override fun onRefresh(refreshLayout: RefreshLayout) { } override fun onLoadMore(refreshLayout: RefreshLayout) { } @SuppressLint("LongLogTag") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) //原始的 smart.setOnRefreshListener { this@MainActivity } smart.setOnLoadMoreListener { this@MainActivity } //let smart.let { it.setOnRefreshListener { this@MainActivity } it.setOnLoadMoreListener { this@MainActivity } } //with with(smart) { setOnRefreshListener { this@MainActivity } setOnLoadMoreListener { this@MainActivity } } //run smart.run { setOnRefreshListener { this@MainActivity } setOnLoadMoreListener { this@MainActivity } } //apply smart.apply{ setOnRefreshListener { this@MainActivity } setOnLoadMoreListener { this@MainActivity } } //also smart.also{ it.setOnRefreshListener { this@MainActivity } it.setOnLoadMoreListener { this@MainActivity } }

    这个几个写法和对比都在这里, 我自己都一一测试过的,局可以实现 ,

    以上就是他们的使用方法 , 有不明白的或者错误的希望指点一下,相互进步.....

     

    胡小牧 认证博客专家 Android Java 小程序 岁月推动着年华,伴随着流水的脚步走过春夏秋冬。回想一路走来磕磕绊绊,感谢前辈们的无私奉献,本文重在共享,欢迎大家转载,评论,指教,点赞,谢谢,如果您对文章存在疑问,或者和您的文章类似,请私信,----------------期待是心痛的根源,心不动,则不痛。
    最新回复(0)