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]

示例

kotlin 复制代码
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]

示例

kotlin 复制代码
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]

示例

kotlin 复制代码
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]

示例

kotlin 复制代码
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]

示例

kotlin 复制代码
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]

相关推荐
霜绛1 天前
C#知识补充(一)——ref和out、成员属性、万物之父和装箱拆箱、抽象类和抽象方法、接口
开发语言·笔记·学习·c#
T.Ree.1 天前
cpp_list
开发语言·数据结构·c++·list
laocooon5238578861 天前
C++ 图片加背景音乐的处理
开发语言·c++
爱编程的鱼1 天前
C# var 关键字详解:从入门到精通
开发语言·c#·solr
MATLAB代码顾问1 天前
MATLAB实现TCN神经网络数值预测
开发语言·matlab
林北北的霸霸1 天前
django初识与安装
android·mysql·adb
南汐汐月1 天前
重生归来,我要成功 Python 高手--day33 决策树
开发语言·python·决策树
星释1 天前
Rust 练习册 :Proverb与字符串处理
开发语言·后端·rust
工会主席-阿冰1 天前
数据索引是无序时,直接用这个数据去画图的话,显示的图是错误的
开发语言·python·数据挖掘
麦麦鸡腿堡1 天前
Java_TreeSet与TreeMap源码解读
java·开发语言