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

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   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除。
▌相关推荐
Kotlin的作用域函数有哪些?
Kotlin作用域函数Kotlin提供了几个作用域函数,用于在特定的作用域内执行代码块。这些作用域函数包括: let函数:let函数允许您在对象上执行代码块,并将对象作为参数传递给代码...【详细内容】
2023-11-20  Tags: Kotlin  点击:(0)  评论:(0)  加入收藏
Kotlin 将取代 Java,跻身 Top 10?| TIOBE 11 月榜单发布
整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)一个月的时间过得很快,转眼之间 11 月 TIOBE 编程语言榜单已最新出炉,一起来看看这个月又有什么值得关注的新变化吧?“确信 Kotlin 能跻身...【详细内容】
2023-11-14  Tags: Kotlin  点击:(19)  评论:(0)  加入收藏
教你将Java代码转换为Kotlin
在2017年的Google I/O大会上,Google 宣布 Kotlin 成为 Android 官方开发语言。Kotlin 是一种强大而多功能的语言,适用于各种开发任务。而且,Kotlin与Java是互操作的,可以轻松地...【详细内容】
2023-07-19  Tags: Kotlin  点击:(61)  评论:(0)  加入收藏
手把手教你将Java代码转换为Kotlin
在2017年的Google I/O大会上,Google 宣布 Kotlin 成为 Android 官方开发语言。Kotlin 是一种强大而多功能的语言,适用于各种开发任务。而且,Kotlin与Java是互操作的,可以轻松地...【详细内容】
2023-07-19  Tags: Kotlin  点击:(56)  评论:(0)  加入收藏
为什么放弃Java后,没有使用Kotlin,新的开发语言正在席卷而来
从 Java 到Kotlin,Kotlin作为Android官方支持语言,获得了更多的关注和采用!这几年,Kotlin的发展势头很猛,可以说由 Java 转 Kotlin 早已势不可挡。那么Kotlin有哪些优势可以打败J...【详细内容】
2023-07-05  Tags: Kotlin  点击:(151)  评论:(0)  加入收藏
Google称内部全在用Kotlin搞安卓开发,体验碾压Java
在 KotlinConf 2023 开幕主题演讲中, Grace Kloba 分享了来自 Google 的最新消息:Google 内部几乎全在用 Kotlin 搞 Android 开发。Kotlin 在 2016 年左右开始在 Android 社区...【详细内容】
2023-04-16  Tags: Kotlin  点击:(244)  评论:(0)  加入收藏
又一巨头从Java迁移到Kotlin:关键应用全部开始切换、安卓代码库超过千万行Kotlin代码
编译|燕珊,核子可乐Meta 现在爱 Kotlin 多于 Java。Facebook 母公司 Meta 正在将其 Android 应用的 Java 代码迁移到 Kotlin。根据 Meta 的官方博客所述,截至今天,其 Android 代...【详细内容】
2022-10-26  Tags: Kotlin  点击:(241)  评论:(0)  加入收藏
保姆级,使用 KotlinScript 构建 SpringBootStarter
因业务需要, 公司内需要使用 SpringBoot Starter 构建 SDK. 不同的是使用了更为灵活的 Kotlin 语言, 构建脚本也换成了 Kotlin Script. 框架: SpringBoot 业务代码语言: Kot...【详细内容】
2022-09-27  Tags: Kotlin  点击:(204)  评论:(0)  加入收藏
ViewBinding 与 Kotlin 委托双剑合璧
前言大家好,我是小彭。过去两年,我们在掘金平台上发表过一些文章,小彭也收到了大家的意见和鼓励。最近,我会陆续搬运到公众号上。ViewBinding 是 Android Gradle Plugin 3.6 中...【详细内容】
2022-09-08  Tags: Kotlin  点击:(351)  评论:(0)  加入收藏
为什么微软力推XML?而谷歌则力推代码描述界面“kotlin”?
其实微软当年的MFC更接近于“代码描述界面”,Delphi等反而是通过专门的配置文件.DFM来描述窗体&hellip;&hellip;比如,这个来自CSDN的截图就是一个典型.DFM文件内容:Delphi项目...【详细内容】
2022-08-21  Tags: Kotlin  点击:(170)  评论:(0)  加入收藏
▌简易百科推荐
Kotlin的作用域函数有哪些?
Kotlin作用域函数Kotlin提供了几个作用域函数,用于在特定的作用域内执行代码块。这些作用域函数包括: let函数:let函数允许您在对象上执行代码块,并将对象作为参数传递给代码...【详细内容】
2023-11-20  沐雨花飞蝶  微信公众号  Tags:Kotlin   点击:(0)  评论:(0)  加入收藏
深度学习之模型压缩、加速模型推理
简介当将一个机器学习模型部署到生产环境中时,通常需要满足一些在模型原型阶段没有考虑到的要求。例如,在生产中使用的模型将不得不处理来自不同用户的大量请求。因此,您将希望...【详细内容】
2023-11-20  小白玩转Python  微信公众号  Tags:深度学习   点击:(1)  评论:(0)  加入收藏
聊聊接口最大并发处理数
今天跟大家聊聊一个 Java 界的老话题,就是怎么理解接口的最大并发处理数。前言生活在 2023 年的互联网时代下,又是在国内互联网越发内卷的背景下,相信大家面试找工作、网上学习...【详细内容】
2023-11-20  waynblog  微信公众号  Tags:接口   点击:(2)  评论:(0)  加入收藏
通过实例理解Web应用跨域问题
在开发Web应用的过程中,我们经常会遇到所谓“跨域问题(Cross Origin Problem)”。跨域问题是由于浏览器的同源策略(Same-origin policy)[1]导致的,它限制了不同源(Origin:域名...【详细内容】
2023-11-20  TonyBai  微信公众号  Tags:Web应用   点击:(2)  评论:(0)  加入收藏
深入理解CPU缓存一致性协议MESI
今天,我们就深入聊聊关于CPU缓存一致性协议MESI的有关知识,希望能够为小伙伴们带来实质性的帮助。好了,不多说了,进入今天的正题。CPU高速缓存CPU为何要有高速缓存CPU在摩尔定律...【详细内容】
2023-11-20  冰河技术  微信公众号  Tags:CPU缓存   点击:(2)  评论:(0)  加入收藏
解密 SSE,像 ChatGPT 一样返回流式响应
我们知道目前的 HTTP/1.1 采用的是标准的请求-响应模型,客户端主动发请求,服务端被动地返回响应。这种模型在客户端需要实时获取结果的场景下是不合适的,因为这意味着客户端需...【详细内容】
2023-11-20  古明地觉的编程教室  微信公众号  Tags:ChatGPT   点击:(3)  评论:(0)  加入收藏
RabbitMQ插件开发指南:定制化你的消息队列
RabbitMQ是一个功能强大的消息队列系统,它提供了灵活的插件机制,使用户能够定制化自己的消息队列。下面将为您介绍RabbitMQ插件开发的指南,让您能够根据自己的需求编写定制化的...【详细内容】
2023-11-20  编程技术汇  今日头条  Tags:RabbitMQ   点击:(4)  评论:(0)  加入收藏
读懂这一篇,集群节点不下线
问题一直在发生1. I&#39;m NotReady阿里云有自己的 Kubernetes 容器集群产品。随着 Kubernetes 集群出货量的剧增,线上用户零星的发现,集群会非常低概率地出现节点 NotReady...【详细内容】
2023-11-20    云原生运维圈  Tags:集群   点击:(2)  评论:(0)  加入收藏
GitHub:程序员正积极使用 AI 编程、JavaScript 语言依然最流行
IT之家 11 月 20 日消息,GitHub 发布了 2023 年度 Octoverse 开源状态报告,其中主要强调了 AI 在开发过程中的作用,并围绕云和 Git 的开源活动展开。官方介绍称,今年的三大趋势...【详细内容】
2023-11-20    IT之家  Tags:AI 编程   点击:(3)  评论:(0)  加入收藏
分片并不意味着分布式
Sharding(分片)是一种将数据和负载分布到多个独立的数据库实例的技术。这种方法通过将原始数据集分割为分片来利用水平可扩展性,然后将这些分片分布到多个数据库实例中。1*yg3P...【详细内容】
2023-11-20  小技术君  微信公众号  Tags:分布式   点击:(4)  评论:(0)  加入收藏
站内最新
站内热门
站内头条