轻松理解kotlin中标准函数let、run、with、apply、also的区别
kotlin中,let、run、with、apply、also这几个标准函数使用起来非常方便,合理使用可以很大程度上的简化代码,但是这几个标准函数用法和功能相似,初学kotlin时,很容易会不知道该选哪一个,其实看下源码并熟悉kotlin的高阶函数就很容易理解了。这几个标准函数的源码如下,新版本里面加入了一些别的代码,不过不影响这里的说明。
注:为了方便描述,以下的a.*的a代表一个对象a;下文中提到的等价只是功能上相同,用法上几乎相同,但在特殊情况下使用起来是会有细微的区别的,比如说a可能为空的时候。
以下四个标准函数,都是返回高阶函数的返回值
- run{}与a.run{}的区别:run{}里面的高阶函数是运行在当前作用域内,a.run{}里面的高阶函数是运行在对象a的作用域内
- a.run{}与a.let{}的区别:a.run{}里面的高阶函数是运行在对象a的作用域内,可以用this关键字(大部分情况下可省略)指代对象a,a.let{}是把对象a作为参数传到高阶函数里面,需要用it来指代对象a
- with(a){} 等价于 a.run{}
public inline fun <R> run(block: () -> R): R = block()
public inline fun <T, R> T.run(block: T.() -> R): R = block()
public inline fun <T, R> T.let(block: (T) -> R): R = block(this)
public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()
以下两个标准函数,都是返回调用对象本身
- a.apply{}与a.also{}是等效的,它们的区别类似run函数和let函数的区别
public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this }
public inline fun <T> T.also(block: (T) -> Unit): T { block(this); return this }
或者可以这样更直观的来理解
- a.run{ 通过this关键字(大部分情况下可省略)来使用对象a } 返回值为{}中的返回值
- run{} 等价于 this.run{} 返回值为{}中的返回值
- a.let{ 通过it来使用对象a } 返回值为{}中的返回值
- with(a){ 通过this关键字(大部分情况下可省略)来使用对象a } 返回值为{}中的返回值
- a.apply{ 通过this关键字(大部分情况下可省略)来使用对象a } 返回值是对象a
- a.also{ 通过it来使用对象a } 返回值是对象a
本人也是初学kotlin,水平有限,如有错误,欢迎指正。
轻松理解kotlin中标准函数let、run、with、apply、also的区别相关推荐
- kotlin作用域函数let run whith apply also 的区别takeIf 的用法
本质区别 有两个主要区别: 引用上下文对象的方式 this 和it 使用this则具备上下文,可以省略this 而it不能省略了,因为它是参数. 返回值 apply also返回上下文对象.let,r ...
- kotlin中标准函数的使用(with、also、aply、let、run)
目录 一.简介 二.let 三.with 三.run 四.apply 五.also 六. run的两种方式为什么this作用域不一样,一个是 调用该函数所在的实例,一个是T对象本身实例 七.为什么le ...
- 理解 Kotlin 中的属性(property)
这篇文章是一时兴起想写的,因为我发现我对Kotlin的属性理解一直有误 Java 中的属性是什么(property) 首先我们要搞清楚在 Java 中属性是什么,在 Java 中类的属性不是指一个字段 ...
- Kotlin中let、run、with、apply及also的差别
/ 今日科技快讯 / 近日,微软刚刚发布了新版操作系统Windows 11,包括全新的设计和诸多新功能,并且能够直接运行安卓应用.该公司首席执行官兼董事长萨蒂亚·纳德拉随后接受媒体专访,他称希 ...
- java kt_java – 我无法理解kotlin中string.kt的源代码实现
在kotlin源代码中,我无法理解如何实现String.kt的长度,如下: package kotlin public class String : Comparable, CharSequence ...
- Kafka科普系列 | 轻松理解Kafka中的延时操作
欢迎跳转到本文的原文链接:https://honeypps.com/mq/kafka-basic-knowledge-of-delay-operation/ 本文起源于之前去面试的一道面试题,面试题大 ...
- js 添加属性_轻松理解JS中的面向对象,顺便搞懂prototype和__proto__
这篇文章主要讲一下JS中面向对象以及 __proto__,ptototype和construcator,这几个概念都是相关的,所以一起讲了. 在讲这个之前我们先来说说类,了解面向对象的朋友应该都知道, ...
- 计算发送延时与传播延迟_Kafka科普系列 | 轻松理解Kafka中的延时操作
作者:朱小厮 来源:公众号朱小厮的博客 本文起源于之前去面试的一道面试题,面试题大致上是这样的:消费者去Kafka里拉去消息,但是目前Kafka中又没有新的消息可以提供,那么Kafka会如何处理? 如 ...
- python ioc框架_轻松理解 Spring 中的 IOC
Spring 简介 Spring 是一个开源的轻量级的企业级框架,其核心是反转控制 (IoC) 和面向切面 (AOP) 的容器框架.我们可以把 Spring 看成是对象的容器,容器中可以包含很多对象, ...
最新文章
- linux系统主机信任,Linux信任主机(SSH)
- 在不知道根节点的情况下生成树形结构 (采用JSONObject)
- 成功解决ImportError: cannot import name 'pywrap_tensorflow'
- 推荐算法炼丹笔记:排序模型CTR点击率预估系列
- Python--day47--mysql索引注意事项
- Html文件转换为Aspx文件后发现样式丢失或失效
- java.lang.NoClassDefFoundError: weblogic/rmi/extensions/DisconnectListener
- 《算法第4版》与《算法导论》比较
- 博科光纤交换机配置及管理 CLI篇
- 清除ie各种缓存.cmd
- 讲解【分布式事务】的一篇良心之作!
- 用c#语言制作点歌程序,c#实现KTV点歌系统
- 如何解决 zsh: event not found: e]st1问题
- clientX、pageX、screenX以及offsetX区别
- NGINX源码之:ngx_hash
- easyExcel以Map的形式读取参数
- Linux游戏 0 A.D安装及汉化
- 网易2017内推笔试题--小易老师的疯狂数列
- 百度2015校园招聘面试题(成功拿到offer)
- echarts 中国地图(带南海诸岛) 及各省份地图json文件