Kotlin let、with、run、apply、also函数的使用
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函数的使用相关推荐
- Kotlin let with run apply also filter if常规用法笔记
仅供个人学习参考 let mVideoPlayer?.let {it.setVideoView(activity.course_video_view)it.setControllerView(acti ...
- [译]Effective Kotlin系列之探索高阶函数中inline修饰符(三)
简述: 不知道是否有小伙伴还记得我们之前的Effective Kotlin翻译系列,之前一直忙于赶时髦研究Kotlin 1.3中的新特性.把此系列耽搁了,赶完时髦了还是得踏实探究本质和基础,从今天开始 ...
- Kotlin学习笔记(二)——函数操作符内置函数
小白笔记(持续更新中) 匿名函数 //匿名函数 fun main() {//count()方法 Returns the length of this char sequence.val len=&qu ...
- Kotlin小知识之高阶函数
文章目录 高阶函数 定义高阶函数 函数类型 高阶函数示例 内联函数 内联函数的作用 内联函数的用法 noinline与crossinline 高阶函数 定义高阶函数 高阶函数和Lambda的关系是密不 ...
- Kotlin 编程核心基石—高阶函数
前言 1. 高阶函数有多重要? 高阶函数,在 Kotlin 里有着举足轻重的地位.它是 Kotlin 函数式编程的基石,它是各种框架的关键元素,比如:协程,Jetpack Compose,Gradle ...
- 「杂谈」如何写好R语言apply家族函数
感觉好久没发有关R语言的博客了.这一年来,我着手开发了两个R包,但基本没怎么发博客. 原因也很简单,可能是我个人的私心吧,或者说是典型的"理论研究者"的"通病" ...
- pandas使用apply函数:在dataframe数据行(row)上施加(apply)函数
pandas使用apply函数:在dataframe数据行(row)上施加(apply)函数 目录 pandas使用apply函数:在dataframe数据行(row)上施加(apply)函数
- pandas使用apply函数:在dataframe数据列(column)上施加(apply)函数
pandas使用apply函数:在dataframe数据列(column)上施加(apply)函数 目录 pandas使用apply函数:在dataframe数据列上施加函数 #apply函数的基本语 ...
- pandas新字段(数据列)生成、使用np.where或者apply lambda函数结合if else生成新的字段,详解及实战
pandas新字段(数据列)生成.使用np.where或者apply lambda函数结合if else生成新的字段,详解及实战 pandas apply用法: pandas apply方法的作用原理 ...
- R语言apply族函数
R语言有很重要的apply族函数:lapply sapply apply tapply mapply.这些函数底层通过C实现,效率比手工遍历高效.apply族函数是高效能计算的运算向量化(Vector ...
最新文章
- java随机数 时间_Java 随机数
- ARM开发培训的总结报告
- 获得主机域名及其IP和Port端口
- 为何Windows版QuickTime突然寿终正寝?
- php分析图片中水印的位置,关于ThinkPHP打水印及设置水印位置的分析
- C# 创建Excel并写入内容
- js获取当前屏幕宽度方法
- CEOI2017 D1T3 mousetrap 树形dp+二分答案
- MS520,参数,非接触式读卡IC
- 计算机为什么获取mac地址,电脑获取mac地址失败怎么办
- 微信小程序-退款业务
- jquery ui table
- php打印出来乱码_PHP输出中文乱码怎么解决?
- 基于C++实现两个分数的加减法
- 资源---2020考研---百度云---资料2(自己看文章简介)
- 读书笔记:汇编语言 第三版 王爽 清华出版社 章六 章七 章八 章九 章十
- [精简]托福核心词汇100
- 关于Tomcat启动失败的解决方案
- 大数据技术原理与应用 概念、存储、处理、分析和应用(林子雨)——第七章 MapReduce
- CAS 介绍 单点登录认证系统