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的区别相关推荐

  1. kotlin作用域函数let run whith apply also 的区别takeIf 的用法

    本质区别 有两个主要区别: 引用上下文对象的方式 this 和it 使用this则具备上下文,可以省略this 而it不能省略了,因为它是参数. 返回值 apply also返回上下文对象.let,r ...

  2. kotlin中标准函数的使用(with、also、aply、let、run)

    目录 一.简介 二.let 三.with 三.run 四.apply 五.also 六. run的两种方式为什么this作用域不一样,一个是 调用该函数所在的实例,一个是T对象本身实例 七.为什么le ...

  3. 理解 Kotlin 中的属性(property)

    这篇文章是一时兴起想写的,因为我发现我对Kotlin的属性理解一直有误 Java 中的属性是什么(property) 首先我们要搞清楚在 Java 中属性是什么,在 Java 中类的属性不是指一个字段 ...

  4. Kotlin中let、run、with、apply及also的差别

    /   今日科技快讯   / 近日,微软刚刚发布了新版操作系统Windows 11,包括全新的设计和诸多新功能,并且能够直接运行安卓应用.该公司首席执行官兼董事长萨蒂亚·纳德拉随后接受媒体专访,他称希 ...

  5. java kt_java – 我无法理解kotlin中string.kt的源代码实现

    在kotlin源代码中,我无法理解如何实现String.kt的长度,如下: package kotlin public class String : Comparable, CharSequence ...

  6. Kafka科普系列 | 轻松理解Kafka中的延时操作

    欢迎跳转到本文的原文链接:https://honeypps.com/mq/kafka-basic-knowledge-of-delay-operation/ 本文起源于之前去面试的一道面试题,面试题大 ...

  7. js 添加属性_轻松理解JS中的面向对象,顺便搞懂prototype和__proto__

    这篇文章主要讲一下JS中面向对象以及 __proto__,ptototype和construcator,这几个概念都是相关的,所以一起讲了. 在讲这个之前我们先来说说类,了解面向对象的朋友应该都知道, ...

  8. 计算发送延时与传播延迟_Kafka科普系列 | 轻松理解Kafka中的延时操作

    作者:朱小厮 来源:公众号朱小厮的博客 本文起源于之前去面试的一道面试题,面试题大致上是这样的:消费者去Kafka里拉去消息,但是目前Kafka中又没有新的消息可以提供,那么Kafka会如何处理? 如 ...

  9. python ioc框架_轻松理解 Spring 中的 IOC

    Spring 简介 Spring 是一个开源的轻量级的企业级框架,其核心是反转控制 (IoC) 和面向切面 (AOP) 的容器框架.我们可以把 Spring 看成是对象的容器,容器中可以包含很多对象, ...

最新文章

  1. linux系统主机信任,Linux信任主机(SSH)
  2. 在不知道根节点的情况下生成树形结构 (采用JSONObject)
  3. 成功解决ImportError: cannot import name 'pywrap_tensorflow'
  4. 推荐算法炼丹笔记:排序模型CTR点击率预估系列
  5. Python--day47--mysql索引注意事项
  6. Html文件转换为Aspx文件后发现样式丢失或失效
  7. java.lang.NoClassDefFoundError: weblogic/rmi/extensions/DisconnectListener
  8. 《算法第4版》与《算法导论》比较
  9. 博科光纤交换机配置及管理 CLI篇
  10. 清除ie各种缓存.cmd
  11. 讲解【分布式事务】的一篇良心之作!
  12. 用c#语言制作点歌程序,c#实现KTV点歌系统
  13. 如何解决 zsh: event not found: e]st1问题
  14. clientX、pageX、screenX以及offsetX区别
  15. NGINX源码之:ngx_hash
  16. easyExcel以Map的形式读取参数
  17. Linux游戏 0 A.D安装及汉化
  18. 网易2017内推笔试题--小易老师的疯狂数列
  19. 百度2015校园招聘面试题(成功拿到offer)
  20. echarts 中国地图(带南海诸岛) 及各省份地图json文件

热门文章

  1. 《并发编程的艺术》读书笔记
  2. vue 基于MediaRecorder+canvas实现视频录屏
  3. 科学哲学-科学文明-科学艺术-科学商业-科学技术-科学管理
  4. 激光雷达的检测仿真代码详解(附Matlab源码详解)
  5. mysql 组合索引 in_mysql组合索引与字段顺序
  6. 主动语态形式表示被动意义
  7. 【0718】 代码管理平台
  8. 初学者小白怎么画动漫女生各式各样的头发?有什么技巧嘛?
  9. 在Moto XT800上获得root权限和安装Android市场等软件
  10. Linux配置临时和永久ip地址