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 }//letsmart.let {it.setOnRefreshListener { this@MainActivity }it.setOnLoadMoreListener { this@MainActivity }}//withwith(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 }//letsmart.let {it.setOnRefreshListener { this@MainActivity }it.setOnLoadMoreListener { this@MainActivity }}//withwith(smart) {setOnRefreshListener { this@MainActivity }setOnLoadMoreListener { this@MainActivity }}//runsmart.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 }//letsmart.let {it.setOnRefreshListener { this@MainActivity }it.setOnLoadMoreListener { this@MainActivity }}//withwith(smart) {setOnRefreshListener { this@MainActivity }setOnLoadMoreListener { this@MainActivity }}//runsmart.run {setOnRefreshListener { this@MainActivity }setOnLoadMoreListener { this@MainActivity }}//applysmart.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 }//letsmart.let {it.setOnRefreshListener { this@MainActivity }it.setOnLoadMoreListener { this@MainActivity }}//withwith(smart) {setOnRefreshListener { this@MainActivity }setOnLoadMoreListener { this@MainActivity }}//runsmart.run {setOnRefreshListener { this@MainActivity }setOnLoadMoreListener { this@MainActivity }}//applysmart.apply{setOnRefreshListener { this@MainActivity }setOnLoadMoreListener { this@MainActivity }}//alsosmart.also{it.setOnRefreshListener { this@MainActivity }it.setOnLoadMoreListener { this@MainActivity }}

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

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

Kotlin let、with、run、apply、also函数的使用相关推荐

  1. Kotlin let with run apply also filter if常规用法笔记

    仅供个人学习参考 let mVideoPlayer?.let {it.setVideoView(activity.course_video_view)it.setControllerView(acti ...

  2. [译]Effective Kotlin系列之探索高阶函数中inline修饰符(三)

    简述: 不知道是否有小伙伴还记得我们之前的Effective Kotlin翻译系列,之前一直忙于赶时髦研究Kotlin 1.3中的新特性.把此系列耽搁了,赶完时髦了还是得踏实探究本质和基础,从今天开始 ...

  3. Kotlin学习笔记(二)——函数操作符内置函数

    小白笔记(持续更新中) 匿名函数 //匿名函数 fun main() {//count()方法 Returns the length of this char sequence.val len=&qu ...

  4. Kotlin小知识之高阶函数

    文章目录 高阶函数 定义高阶函数 函数类型 高阶函数示例 内联函数 内联函数的作用 内联函数的用法 noinline与crossinline 高阶函数 定义高阶函数 高阶函数和Lambda的关系是密不 ...

  5. Kotlin 编程核心基石—高阶函数

    前言 1. 高阶函数有多重要? 高阶函数,在 Kotlin 里有着举足轻重的地位.它是 Kotlin 函数式编程的基石,它是各种框架的关键元素,比如:协程,Jetpack Compose,Gradle ...

  6. 「杂谈」如何写好R语言apply家族函数

    感觉好久没发有关R语言的博客了.这一年来,我着手开发了两个R包,但基本没怎么发博客. 原因也很简单,可能是我个人的私心吧,或者说是典型的"理论研究者"的"通病" ...

  7. pandas使用apply函数:在dataframe数据行(row)上施加(apply)函数

    pandas使用apply函数:在dataframe数据行(row)上施加(apply)函数 目录 pandas使用apply函数:在dataframe数据行(row)上施加(apply)函数

  8. pandas使用apply函数:在dataframe数据列(column)上施加(apply)函数

    pandas使用apply函数:在dataframe数据列(column)上施加(apply)函数 目录 pandas使用apply函数:在dataframe数据列上施加函数 #apply函数的基本语 ...

  9. pandas新字段(数据列)生成、使用np.where或者apply lambda函数结合if else生成新的字段,详解及实战

    pandas新字段(数据列)生成.使用np.where或者apply lambda函数结合if else生成新的字段,详解及实战 pandas apply用法: pandas apply方法的作用原理 ...

  10. R语言apply族函数

    R语言有很重要的apply族函数:lapply sapply apply tapply mapply.这些函数底层通过C实现,效率比手工遍历高效.apply族函数是高效能计算的运算向量化(Vector ...

最新文章

  1. java随机数 时间_Java 随机数
  2. ARM开发培训的总结报告
  3. 获得主机域名及其IP和Port端口
  4. 为何Windows版QuickTime突然寿终正寝?
  5. php分析图片中水印的位置,关于ThinkPHP打水印及设置水印位置的分析
  6. C# 创建Excel并写入内容
  7. js获取当前屏幕宽度方法
  8. CEOI2017 D1T3 mousetrap 树形dp+二分答案
  9. MS520,参数,非接触式读卡IC
  10. 计算机为什么获取mac地址,电脑获取mac地址失败怎么办
  11. 微信小程序-退款业务
  12. jquery ui table
  13. php打印出来乱码_PHP输出中文乱码怎么解决?
  14. 基于C++实现两个分数的加减法
  15. 资源---2020考研---百度云---资料2(自己看文章简介)
  16. 读书笔记:汇编语言 第三版 王爽 清华出版社 章六 章七 章八 章九 章十
  17. [精简]托福核心词汇100
  18. 关于Tomcat启动失败的解决方案
  19. 大数据技术原理与应用 概念、存储、处理、分析和应用(林子雨)——第七章 MapReduce
  20. CAS 介绍 单点登录认证系统

热门文章

  1. centos使用镜像源轻松配置golang+vscode的方法
  2. 错误提示没了_ESC错误排查-系统启动篇
  3. 前端Vue学习之路(五)插件的使用
  4. Qt实现 指针式时钟+动态时钟 (详细注释)
  5. 有了NPU,还要DSP吗?
  6. TVM性能评估分析(三)
  7. 深度学习加速器堆栈Deep Learning Accelerator Stack
  8. 2020年Yann Lecun深度学习笔记(下)
  9. Mybatis的各种查询功能
  10. Redis安装与卸载