笔记:kotlin:标准函数之作用域函数(Scope Functions)

kotlin标准函数指的是Standard.kt文件中定义的函数。本文将根据函数功能的相似性一个一个记录。这些标准函数本质上都是接收lambda参数的函数,下文为了方便理解和使用,在描述上将使用更为通俗形象的说法。目前标准函数一共只有11个,如果同名重载的只算一个那就连10个也不到。我们可将其大致分类为作用域函数(Scope Functions)、其他函数(除了作用域函数以外,其他函数没有具体的归类)。

作用域函数(Scope Functions)

我们先看下官方对于作用域函数的介绍:
作用域函数一共有5个,它们唯一的目的是在对象上下文环境中执行代码块。当你使用对象调用这些函数时,通过lambda表达式它们将给你提供一个临时作用域。在这个范围内你可以不通过该对象的名字访问该对象。这种函数称为作用域函数。基本上,这些函数的作用是相同的:在一个对象上执行一段代码。不同的是这个对象在块中是如何变得可用的,以及整个表达式的结果是什么。
我们先介绍这5个作用域函数(Scope Functions):let, run, with, apply, 和 also.

//这里的代码是为了下文介绍标准函数使用到的“辅助”对象
val things = mutableListOf("pineapple", "apple", "pen")
class Student {
    var name: String = ""
    var age: Int = 0
}
var xiaoxin: Student? = null

let函数

描述:某对象“创建”一个拥有该对象引用的代码区域。该引用在该区域的名字为“it”,返回值为最后一行的返回值,若最后一行无返回值则返回Unit(对应java中的void)。
常见用处:主要配合"?."操作符来进行辅助判空处理。
格式:

//由于全局变量可以在其他线程进行操作,所以将下面的let语句换成if判断语句仍然有空指针风险
val letResult = xiaoxin?.let {
    println(it.name)
    println(it.age)
    xiaoxin.name
}

also函数

**描述:also函数和let函数极其的相似。唯一的不同就是返回值不同,let是将lambda最后一行的返回值作为返回值,而also则是将被操作对象本身作为返回值。
格式:

//下文中的this只是为了表示其上下文为StringBuilder()对象,可以省略
val letResult = xiaoxin?.also {
    it.name = "xiao xin"
    it.age = 18
}?.also {
    println(it.name)
    println(it.age)
}

run函数

**描述:run函数和let函数极其的相似。let是像将操作对象变成参数一样的操作,而run函数则提供了被操作对象的上下文环境,即通过“this”就可以调用被操作的对象(let函数中的it其实是lambda函数的参数)。而返回值也和let一样,返回最后一行。
格式:

//下文中的this只是为了表示其上下文为StringBuilder()对象,可以省略
val runResult = StringBuilder().run {
     for (thing in things) {
        this.append(thing).append("、")
    }
    this.toString()
}

run函数“重载”

**描述:除了上面描述的run函数外,作用域函数中run还有一个“重载”的函数,与前面的run函数不同,该“重载”函数并不是扩展函数,且不提供任何对象的上下文环境。它的使用看起来就像仅仅开辟了一块单独的区域执行某些语句。当然它仍然是讲最后一行的返回值作为该函数的返回值。
格式:

val run2Result = run {
    val builder = StringBuilder()
    for (thing in things) {
        builder.append(thing).append("、")
    }
    builder.toString()
}

apply函数

**描述:apply函数和run函数极其的相似。同样的调用方式,同样提供上下文环境,唯一不通的是apply的返回值不是最后一行,而是被操作对象本身。
格式:

//下文中的this只是为了表示其上下文为StringBuilder()对象,可以省略
val applyResult = StringBuilder().apply {
     for (thing in things) {
        this.append(thing).append("、")
    }
}

with函数

描述:with和上面几个函数有处明显的不同,上面几个函数都是扩展函数(由于被扩展的class为泛型形式表述,所以所有的对象都可以调用上面那些函数)。而with则是以传参的形式来操作对象(第一个参数为被操作对象,第二个为lambda函数)。同run、apply一样创造了一个具有操作对象上下文的环境。同run、let一样,最后一行为返回值。所以说with又和run极其相似,对于操作对象的获取一个是扩展函数的形式,一个是传参形式。
格式:

val withResult = with(StringBuilder()) {
    for (thing in things) {
        this.append(thing).append("、")
    }
    this.toString()
}
上面几个函数功能几乎完全一样,而且几乎所有的使用情景都可以互相替换,只有细微的使用方式不同,如何区分以及合理使用需要用户通过大量的经验和习惯来实现。

下一遍文章将介绍kotlin标准函数中剩下的几个函数(TODO,takeIf,takeUnless,repeat)
地址:https://www.jianshu.com/p/f9a7c2f1446b

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345