您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

Kotlin的作用域函数有哪些?

时间:2023-11-20 14:50:47  来源:微信公众号  作者:沐雨花飞蝶
Kotlin的作用域函数有哪些?

Kotlin作用域函数

Kotlin提供了几个作用域函数,用于在特定的作用域内执行代码块。这些作用域函数包括:

  1. let函数:let函数允许您在对象上执行代码块,并将对象作为参数传递给代码块。它的语法如下:

    obj.let {
        // 在这里可以使用obj对象
    }
    

    在代码块中,您可以使用it来引用传递给let函数的对象。

  2. run函数:run函数类似于let函数,但它不使用it来引用对象,而是直接使用this关键字。它的语法如下:

    obj.run {
        // 在这里可以使用this关键字引用obj对象
    }
    
  3. with函数:with函数允许您在没有接收者对象的上下文中执行代码块。它的语法如下:

    with(obj) {
        // 在这里可以直接使用obj对象的成员
    }
    
  4. Apply函数:apply函数类似于run函数,但它返回的是对象本身,而不是代码块的结果。它的语法如下:

    obj.apply {
        // 在这里可以使用this关键字引用obj对象
    }
    
  5. also函数:also函数类似于let函数,但它返回的是对象本身,而不是代码块的结果。它的语法如下:

    obj.also {
        // 在这里可以使用it来引用obj对象
    }
    

这些作用域函数可以根据不同的使用场景来选择,可以简化代码,并提供更清晰的上下文。

let

let作用域函数可以在一个对象上执行一系列操作,并返回一个结果。它的语法如下:

object.let {
    // 在这里可以对object进行操作
    // 返回结果
}

使用let函数可以方便地对一个对象进行操作,例如:

val name: String? = "John"

name?.let {
    // 当name不为null时执行以下操作
    println("Name is $it")
}

在上面的例子中,如果name不为null,则会打印出Name is Johnlet函数将name作为参数传递给lambda表达式,并在lambda表达式中使用it来引用该参数。

let函数还可以用于链式调用,例如:

val result = "Hello, World!".let {
    // 对字符串进行操作
    it.toUpperCase()
}.let {
    // 继续对字符串进行操作
    it.substring(0, 5)
}

println(result) // 输出 "HELLO"

在上面的例子中,let函数将字符串转换为大写,并截取前5个字符,最终结果为HELLO

let函数是Kotlin中非常有用的一个作用域函数,可以简化代码并提高可读性。

run

run作用域函数是一个高阶函数,它可以在指定的上下文中执行代码块,并返回最后一个表达式的结果。run函数的语法如下:

run(block: T.() -> R): R

obj.run {
    // 在这里可以使用this关键字引用obj对象
}

其中 block是要执行的代码块,T是上下文对象的类型,R是代码块的返回类型。

使用run函数可以方便地在一个对象的上下文中执行多个操作,而不需要重复引用对象的名称。例如:

val person = Person("Alice", 25)

val result = person.run {
    println("Name: $name")
    println("Age: $age")
    age + 1
}

println("Result: $result")

在上面的例子中,我们创建了一个Person对象,并使用run函数在该对象的上下文中执行了两个操作:打印出姓名和年龄,并返回年龄加1的结果。最后,我们打印出了结果。

请注意,run函数的返回值是代码块的最后一个表达式的结果。在上面的例子中,run函数返回了age + 1的结果。

with

with作用域函数允许你在一个特定的上下文中执行一系列操作,而无需重复引用该上下文对象。

with函数的语法如下:

with(obj) {
    // 在这里可以使用obj的成员函数和属性
    // 进行一系列操作
}

with函数的代码块中,你可以直接使用obj的成员函数和属性,而无需重复使用对象名来引用它们。这样可以使代码更加简洁和易读。

示例代码:

data class Person(val name: String, var age: Int)

fun mAIn() {
    val person = Person("Alice", 25)
    
    with(person) {
        println("姓名:$name")
        println("年龄:$age")
        age += 1
    }
    
    println("年龄增加后的值:${person.age}")
}

输出结果为:

姓名:Alice
年龄:25
年龄增加后的值:26

在上面的示例中,我们使用with函数来操作person对象。在with函数的代码块中,我们可以直接使用nameage属性,而无需重复使用person对象名来引用它们。同时,我们还可以修改age属性的值,这样会直接影响到person对象。

apply

apply作用域函数允许你在一个对象上执行一系列操作,并返回该对象本身。它的语法如下:

object.apply {
    // 在这里执行一系列操作
}

使用apply函数可以方便地对一个对象进行初始化或者配置。在apply的代码块中,你可以调用对象的方法、设置属性等。最后,apply函数会返回该对象本身,这样你可以继续对该对象进行其他操作。

示例代码:

val person = Person().apply {
    name = "Alice"
    age = 25
    setAddress("123 Main St")
}

在上面的示例中,我们创建了一个Person对象,并使用apply函数对其进行了初始化。在apply的代码块中,我们设置了nameage属性,并调用了setAddress方法。最后,apply函数返回了该对象本身,我们可以继续对其进行其他操作。

使用apply函数可以简化代码,特别是在需要对一个对象进行多个操作时。可以提高代码的可读性和可维护性。

also

also作用域函数允许你在对象上执行一些操作,并返回对象本身。它的语法如下:

inline fun <T> T.also(block: (T) -> Unit): T

obj.also {
    // 在这里可以使用it来引用obj对象
}

使用also函数,你可以在对象上执行一些操作,例如打印日志、修改属性等。这个函数会返回对象本身,因此你可以在链式调用中使用它。

示例代码:

val list = mutableListOf(1, 2, 3)

list.also {
    println("原始列表:$it")
    it.add(4)
    it.remove(2)
}.also {
    println("修改后的列表:$it")
}

输出结果为:

原始列表:[1, 2, 3]
修改后的列表:[1, 3, 4]

在上面的示例中,我们使用also函数在list对象上执行了两个操作:添加元素4和移除元素2。同时,我们还在每个操作之前打印了相关的日志。最后,我们打印了修改后的列表。

also函数是一个非常有用的作用域函数,它可以让你在对象上执行一些操作,并返回对象本身。这在链式调用和调试过程中非常有用。

使用及适用场景

作用域函数可以在特定的上下文中执行代码块,并且可以方便地访问上下文对象。

  1. let函数:let函数将上下文对象作为参数传递给代码块,并返回代码块的结果。它适用于需要对对象进行非空判断或者进行链式调用的场景。
val result = someObject?.let {
    // 对非空对象进行操作
    // 返回操作结果
}
  1. run函数:run函数将上下文对象作为接收者(this)传递给代码块,并返回代码块的结果。它适用于需要在上下文对象上执行多个操作的场景。
val result = someObject.run {
    // 在上下文对象上执行操作
    // 返回操作结果
}
  1. with函数:with函数将上下文对象作为参数传递给代码块,并返回代码块的结果。它类似于run函数,但是不使用扩展函数的方式调用。
val result = with(someObject) {
    // 在上下文对象上执行操作
    // 返回操作结果
}
  1. apply函数:apply函数将上下文对象作为接收者(this)传递给代码块,并返回上下文对象本身。它适用于需要在创建对象后立即对其进行初始化的场景。
val someObject = SomeObject().apply {
    // 对对象进行初始化操作
}
  1. also函数:also函数将上下文对象作为参数传递给代码块,并返回上下文对象本身。它类似于apply函数,但是不使用扩展函数的方式调用。
val someObject = SomeObject().also {
    // 对对象进行初始化操作
}

作用域函数可以提高代码的可读性和简洁性,适用于各种场景,如链式调用、对象初始化等。根据具体的需求和编码风格,选择合适的作用域函数可以使代码更加清晰和易于维护。



Tags:Kotlin   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
基于GitHub App 深度讲解Kotlin高级特性与框架设计
基于GitHub App 深度讲解Kotlin高级特性与框架设计GitHub App 是 GitHub 平台上的一种特殊类型的应用程序,它允许开发者通过 GitHub API 与 GitHub 上的仓库和组织进行交互...【详细内容】
2023-11-28  Search: Kotlin  点击:(198)  评论:(0)  加入收藏
Kotlin的作用域函数有哪些?
Kotlin作用域函数Kotlin提供了几个作用域函数,用于在特定的作用域内执行代码块。这些作用域函数包括: let函数:let函数允许您在对象上执行代码块,并将对象作为参数传递给代码...【详细内容】
2023-11-20  Search: Kotlin  点击:(101)  评论:(0)  加入收藏
Kotlin 将取代 Java,跻身 Top 10?| TIOBE 11 月榜单发布
整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)一个月的时间过得很快,转眼之间 11 月 TIOBE 编程语言榜单已最新出炉,一起来看看这个月又有什么值得关注的新变化吧?“确信 Kotlin 能跻身...【详细内容】
2023-11-14  Search: Kotlin  点击:(336)  评论:(0)  加入收藏
教你将Java代码转换为Kotlin
在2017年的Google I/O大会上,Google 宣布 Kotlin 成为 Android 官方开发语言。Kotlin 是一种强大而多功能的语言,适用于各种开发任务。而且,Kotlin与Java是互操作的,可以轻松地...【详细内容】
2023-07-19  Search: Kotlin  点击:(128)  评论:(0)  加入收藏
手把手教你将Java代码转换为Kotlin
在2017年的Google I/O大会上,Google 宣布 Kotlin 成为 Android 官方开发语言。Kotlin 是一种强大而多功能的语言,适用于各种开发任务。而且,Kotlin与Java是互操作的,可以轻松地...【详细内容】
2023-07-19  Search: Kotlin  点击:(159)  评论:(0)  加入收藏
为什么放弃Java后,没有使用Kotlin,新的开发语言正在席卷而来
从 Java 到Kotlin,Kotlin作为Android官方支持语言,获得了更多的关注和采用!这几年,Kotlin的发展势头很猛,可以说由 Java 转 Kotlin 早已势不可挡。那么Kotlin有哪些优势可以打败J...【详细内容】
2023-07-05  Search: Kotlin  点击:(242)  评论:(0)  加入收藏
Google称内部全在用Kotlin搞安卓开发,体验碾压Java
在 KotlinConf 2023 开幕主题演讲中, Grace Kloba 分享了来自 Google 的最新消息:Google 内部几乎全在用 Kotlin 搞 Android 开发。Kotlin 在 2016 年左右开始在 Android 社区...【详细内容】
2023-04-16  Search: Kotlin  点击:(360)  评论:(0)  加入收藏
又一巨头从Java迁移到Kotlin:关键应用全部开始切换、安卓代码库超过千万行Kotlin代码
编译|燕珊,核子可乐Meta 现在爱 Kotlin 多于 Java。Facebook 母公司 Meta 正在将其 Android 应用的 Java 代码迁移到 Kotlin。根据 Meta 的官方博客所述,截至今天,其 Android 代...【详细内容】
2022-10-26  Search: Kotlin  点击:(415)  评论:(0)  加入收藏
保姆级,使用 KotlinScript 构建 SpringBootStarter
因业务需要, 公司内需要使用 SpringBoot Starter 构建 SDK. 不同的是使用了更为灵活的 Kotlin 语言, 构建脚本也换成了 Kotlin Script. 框架: SpringBoot 业务代码语言: Kot...【详细内容】
2022-09-27  Search: Kotlin  点击:(332)  评论:(0)  加入收藏
ViewBinding 与 Kotlin 委托双剑合璧
前言大家好,我是小彭。过去两年,我们在掘金平台上发表过一些文章,小彭也收到了大家的意见和鼓励。最近,我会陆续搬运到公众号上。ViewBinding 是 Android Gradle Plugin 3.6 中...【详细内容】
2022-09-08  Search: Kotlin  点击:(552)  评论:(0)  加入收藏
▌简易百科推荐
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(5)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(12)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(8)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(10)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(8)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
Kubernetes 究竟有没有 LTS?
从一个有趣的问题引出很多人都在关注的 Kubernetes LTS 的问题。有趣的问题2019 年,一个名为 apiserver LoopbackClient Server cert expired after 1 year[1] 的 issue 中提...【详细内容】
2024-03-15  云原生散修  微信公众号  Tags:Kubernetes   点击:(5)  评论:(0)  加入收藏
站内最新
站内热门
站内头条