当前位置: 首页 > news >正文

Kotlin作用域函数全解:run/with/apply/let/also与this/it的魔法对决

Kotlin作用域函数全解:run/with/apply/let/also与this/it的魔法对决

在Kotlin的魔法世界里,作用域函数就像五位各怀绝技的魔法师,它们能在代码的舞台上施展独特的咒语,让对象操作变得既优雅又高效。今天,我们就来一场魔法对决,揭秘run、with、apply、let、also这五位魔法师的独门秘籍,以及它们与this/it的微妙关系[1][4][6][7]

一、魔法师登场:作用域函数概览

1.1 魔法师名单

  • let:非空对象的操作大师,擅长链式调用和空安全检查。
  • run:全能选手,既能在对象上下文中施展魔法,又能返回结果。
  • with:派对组织者,邀请对象参加派对,自由操作。
  • apply:美容师,专注对象属性的美化与配置。
  • also:记录员,记录对象信息,不改变对象本身。

1.2 魔法道具:this与it

  • this:在run、with、apply中,它是对象的化身,直接调用对象的方法和属性。
  • it:在let和also中,它是对象的代名词,简洁地代表被操作的对象。

二、魔法对决:作用域函数的详细解析

2.1 let:非空对象的守护者

魔法咒语obj?.let { it.doSomething() }

使用场景:当你想对非空对象执行一系列操作,并确保空安全时,let就是你的不二之选。它像一位谨慎的守卫,只有在对象非空时才会施展魔法。[2][10]

示例

val extras: Bundle? = getExtras() // 假设这是可能为空的Bundle对象
extras?.let { val metadataList = it.getParcelableArrayList<MediaBrowserCompat.MediaItem>(MEDIAITEM_LIST_KEY) ?: emptyList()// 处理metadataList...
}

在这个例子中,let确保了只有在extras非空时,才会执行获取metadataList的操作,避免了NullPointerException的尴尬。[2]

2.2 run:全能选手的表演时间

魔法咒语obj.run { doSomething(); returnResult }

使用场景:run就像一位多才多艺的演员,既能在对象上下文中自由表演,又能返回表演的结果。无论是初始化对象还是执行复杂操作,run都能游刃有余。[4][6][7]

示例

val user = User().run {name = "John"age = 30"User: $name, Age: $age" // 返回配置后的用户信息和格式化字符串
}

在这个例子中,run不仅配置了User对象的属性,还返回了一个包含用户信息的字符串。[6]

2.3 with:派对组织者的狂欢

魔法咒语with(obj) { doSomething(); returnResult }

使用场景:with就像一位热情的派对组织者,它邀请对象参加派对,并在派对上自由操作对象。[1][4][6][7]适合对一个对象执行多个操作,而不需要链式调用的场景。[4]

示例

val result = with(StringBuilder()) {append("Hello")append(" ")append("World")toString() // 返回构建的字符串
}

在这个例子中,with组织了一个字符串构建的派对,最终返回了构建好的字符串。[6]

2.4 apply:美容师的精致手艺

魔法咒语obj.apply { doSomething() }

使用场景:apply就像一位细心的美容师,它专注对象属性的美化与配置,并返回配置后的对象本身。[1][2][4][6][7]适合初始化或配置对象的场景。[2][4]

示例

val button = Button().apply {text = "Click Me"setOnClickListener { /* 处理点击事件 */ }
}

在这个例子中,apply为Button对象配置了文本和点击事件,并返回了配置后的Button对象。[6]

2.5 also:记录员的细致记录

魔法咒语obj.also { it.doSomething() }

使用场景:also就像一位细心的记录员,它记录对象的信息或执行副作用操作,而不改变对象本身。[1][2][4][6][7]适合在对象操作后需要执行额外操作的场景。[2]

示例

val list = mutableListOf(1).also {it.add(2)println("List after addition: $it") // 记录列表添加元素后的状态
}

在这个例子中,also为列表添加了元素,并打印了列表添加元素后的状态,同时返回了原始列表。[6]

三、魔法对决的终极奥义:this与it的对比

  • this:在run、with、apply中,this是对象的直接引用,可以省略(如this.property可简写为property)。它让代码更加简洁,直接操作对象属性。[4][6][7]
  • it:在let和also中,it是对象的代名词,不可省略。它让代码在lambda表达式中更加清晰地表示被操作的对象。[6][7]

四、魔法总结:作用域函数的选择艺术

  • 需要返回对象本身:选择apply或also,它们会在操作后返回对象本身,适合链式调用或初始化场景。[4]
  • 需要返回操作结果:选择let、run或with,它们会返回lambda表达式的结果,适合需要获取操作结果的场景。[4]
  • 空安全检查:let是处理可能为空对象的利器,它能确保只有在对象非空时才会执行操作。[2][10]
  • 对象配置与初始化:apply是配置对象属性的首选,它能让代码更加简洁和易读。[2][4]

在Kotlin的魔法世界里,作用域函数就像五位各具特色的魔法师,它们各自拥有独特的咒语和力量。通过合理选择和使用这些作用域函数,我们可以让代码变得更加简洁、高效和易读。希望今天的魔法对决能让你对Kotlin的作用域函数有更深入的理解,并在实际的开发中灵活运用它们,施展出更加优雅的代码魔法![4]

http://www.dtcms.com/a/333859.html

相关文章:

  • LORA模块的通讯速率(915Mhz)以及通道数量规划
  • 图片滤镜处理(filters)
  • 【机器学习深度学习】生成式评测
  • 数据处理分析环境搭建+Numpy使用教程
  • Design Compiler:使用IC Compiler II Link
  • PCA降维 提升模型训练效率
  • CUDA TensorRT Python智能提示补全解决方案
  • MySQL约束知识点
  • iceberg 底层存储HDFS与juiceFS的区别
  • epoll发数据学习
  • 自己开发的VIP monitor通过TLM port口连接到RefenceModel 但是get不出transaction的问题
  • 《中国棒球知识科普》国家级运动健将标准·棒球1号位
  • 力扣(接雨水)——标准双指针
  • 最长链(二叉树直径DFS)
  • 【学习笔记】NTP服务客户端配置
  • 医疗领域名词标准化工具
  • 二分算法(模板)
  • Vue插槽---slot详解
  • RAGFlow入门
  • 大麦APP抢票揭秘
  • 亚马逊新品推广的智能突围:从传统SP广告到DeepBI策略革新
  • 结合项目对AOP的实践和理论讲解-AOP八股
  • 第十四节:物理引擎集成:Cannon.js入门
  • Windows Server Core智能调优
  • 智能体开发实战:用Deepseek做一个生成思维导图的智能体
  • SSH协议的GIT转换
  • 访问者模式C++
  • Day55 Java面向对象09 super关键字详解
  • MySQL 高效查询五虎将——分页、排序、分组、去重、聚合函数实战手册
  • 解决HFSS许可证激活错误的实用方法