标准函数with、run、apply等和静态方法

Android第一行代码——快速入门 Kotlin 编程(3.7 Kotlin课堂:标准函数和静态方法) 因此每章的 Kotlin 课堂里,我都会结合所在章节的内容,拓展出更多Kotlin 的使用技巧,这将会是你提升自己 Kotlin 水平的绝佳机会。函数也是极其类似的,都要在某个对象上调用,并且只接收一个 Lambda 参数,也会在 Lambda 表达式中提供调用对象的上下文,但是apply函数无法指定返回值,而是会自动返回调用对象本身。好了,关于Kotlin 的标准函数就讲到这里,本书后面的章节中还将会有大量使用标准函数的代码 示例,到时候你会对它们掌握得越来越熟练。那么这个函数有什么作用呢? 阅读详情

一、标准函数

Kotlin的标准函数有很多,先学习常用的with、run、apply三个。

还有let标准函数,主要是配合 ?. 操作符进行判空处理,以保证线程安全。

标准函数with:

with函数接收两个参数:

第一个参数可以是任意类型的对象。

第二个参数是一个Lambda表达式,表达式中提供参数对象的上下文,即参数对象所在的场景,并使用Lambda表达式中的最后一行作为返回值。

使用格式为:

val res = with(obj){
    //obj的上下文,要做的事
    "value"   //with的返回值
}

具体使用场景:当我们需要连续调用同一个对象的多种方法时,可以使代码更加简洁。例如,正常些一个吃水果的代码:

fun main() {
    val list = mutableListOf<String>("Apple", "Banana", "Orange", "Pear", "Grape")
    val builder = StringBuilder()
    builder.append("Start eating fruits:\n")
    for (fruit in list) {
        builder.append(fruit).append('\n')
    }
    builder.append("You have eat all fruits!")
    val res = builder.toString()
    println(res)
}

代码中,我们连续调用了builder对象的很多函数方法,可以考虑使用with来进行简化,简化代码:

    val res2 = with(builder) {
        append("Start eating fruits:\n")
        for (fruit in list) {
            append(fruit).append('\n')
        }
        append("You have eat all fruits!")
        toString()
    }
    println(res2)

根据with函数的使用格式,分析可知:

给with传入了一个StringBuilder对象,接下来整个Lambda表达式的上下文就是这个StringBuilder对象,这个builder对象会以 this对象形式 被传入到Lambda表达式,就不需要像之前builder.append()这样进行操作,直接调用append函数即可,其它的函数像toString()类似,都不需要对象进行调用。

进一步简化了代码。

标准函数run:

run()函数和with()函数区别不大,with()函数需要传入一个参数,然后以这个参数作为上下文进行操作。run()函数不需要传入参数,但是他需要在一个对象的基础上进行操作,他的使用格式如下:

val res = obj.run{
    //obj的上下文
    "value" //返回结果
}

从使用格式上看,与with()函数区别不大,Lambda表达式内的写法两者具有一致性。

使用run函数来更改上述吃水果的代码如下:

    val res3 = builder.run {
        append("Start eating fruits:\n")
        for (fruit in list) {
            append(fruit).append('\n')
        }
        append("You have eat all fruits!")
        toString()
    }
    println(res3)

只是将调用with函数并传入StringBuilder对象改成了调用StringBuilder对象的run方法,其它代码保持不变。

标准函数apply:

apply()函数和run()函数相似,都不需要传入参数,都需要在某个函数上调用,并且只接收一个lambda表达式,也会在Lambda表达式中提供该对象的上下文。但是apply()函数不返回值,而是会自动返回该对象本身。apply()函数的使用格式如下:

val res = obj.apply{
    //obj的上下文
}
//res == obj

使用apply()函数来更改上述吃水果代码如下:

    val res4 = builder.apply {
        append("Start eating fruits:\n")
        for (fruit in list) {
            append(fruit).append('\n')
        }
        append("You have eat all fruits!")
    }
    println(res4.toString())

想起之前在向intent中传递数据的代码,可以简化更改为:

val intent = Intent(context, SecondActivity::class.java).apply {
    putExtra("data1", param1)
    putExtra("data2", param2)
}

由于intent并不需要返回值,这里使用apply()函数来进行简化。

二、静态方法

Kotlin不同于java,java中定义静态方法,一般会在类中,使用static关键字来定义静态方法,使得该静态方法能够在不创建类的实例对象时,可以直接通过类名调用。例如:

public class Util {
    public static void doSomeThing() {
        System.out.println("Let's do something!");
    }
}

这就是一个简单的工具类,工具类没有创建实例对象的必要,而且全局通用。

在Kotlin中,定义一个工具类,一般使用单例类来进行创建,上述代码在Kotlin中变为:

object Unit{
    fun doSomeThing() {
        println("Let's do something!")
    }
}

将Unit定义为object类型,声明它是单例类。

这虽然不是静态方法,但是仍旧可以使用Unit.doSomeThing()来调用,和静态方法类似。

但是,使用这种方法,这样会导致这个类的所有方法都是工具类,当我们只想让类的某一个函数成为静态方法时,需要使用 companion object 方法。这相当于在类中创建了一个伴生类,而Kotlin会保证该类中只有这一个伴生类。代码如下:

class Unit{

    fun doAction() {
        println("do action!")
    }

    companion object{
        fun doSomeThing() {
            println("Let's do someThing!")
        }
    }
}

这里声明了Unit是普通class类,然后使用companion object创建了该类的伴生类,可直接通过该类名调用伴生类中的函数,即 Unit.doSomeThing()。

单例类和companion object都只是在语法的形式上模仿了静态方法的调用方式,实际上它们都不是真正的静态方法。因此如果你在Java代码中以静态方法的形式去调用这些方法的话,你会发现这些方法并不存在。

Kotlin为构建静态方法提供了两种方式:注解和顶层

注解:

如果我们给刚才的单例类或companion object中的方法加上@JvmStatic注解,那么Kotlin编译器就会将这些方法编译成真正的静态方法,例如;

class Unit{

    fun doAction() {
        println("do action!")
    }

    companion object{
        @JvmStatic
        fun doSomeThing() {
            println("Let's do someThing!")
        }
    }
}

这样doSomeThing() 就成了静态方法。那么现在不管是在Kotlin中还是在Java中,都可以使用Util.doAction2()的写法来调用了。

顶层:

顶层方法指的是那些没有定义在任何类中的方法,比如我们编写的main()方法。Kotlin编译器会将所有的顶层方法全部编译成静态方法,因此只要你定义了一个顶层方法,那么它就一定是静态方法。

重新创建一个空的Kotlin文件,例如叫做TopFun.kt,文件中没有任何类,只有fun 定义的函数,这就是顶层方法。这个文件中的所有方法都是静态方法,可以全局调用。

但如果是在Java代码中调用,你会发现是找不到使用顶层方法定义的这些静态方法的,因为Java中没有顶层方法这个概念,所有的方法必须定义在类中。

我们刚才创建的Kotlin文件名叫作TopFun.kt,于是Kotlin编译器会自动创建一个叫作TopFunkt的Java类,其中的方法就是以静态方法的形式定义在TopFunkt类里面的,因此在Java中直接使用TopFunkt.fun()的写法来调用就可以了。

《第一行代码 第3版》学习笔记——Kotlin讲堂:标准函数和静态方法 Java中静态方法可以用类名调用,而在Kotlin中没有静态方法的概念。对于Java中工具类的这种功能,Kotlin中推荐使用单例类的方式实现。} }1、使用单例类单例类就可以像Java中的静态方法一样使用Util.doAction()进行调用。使用object关键字后,Kotlin会自动帮我们创建一个类,并保证这个类全局只有一个。但是使用单例类的方式会使得单例类中的所有方法都变成了类似静态调用的方式。如果希望将其中的一个方法变成静态方法的调用方式,可以使用companion object。 阅读详情

相关推荐

kotlin 标准函数和静态方法 with、run、apply

一.标准函数 1.with函数 with函数接受两个参数,第一个是任意类型的对象,第二个是lambda表达式。 作用:连续调用同一对象的多个方法。返回值是最后一个值 格式如下: val result = with(obj){ // 这里是obj的上下文 "value" // with函数的返回值 } 举个例子: // val list = li...

龚礼鹏的博客 607

vue3+vuerouter报错的解决方案

vue-router.mjs:3472 TypeError: s.then is not a function at vue-router.mjs:2104:52 at Object.runWithContext (runtime-core.esm-bundler.js:3865:18) at R (vue-router.mjs:3239:19) at vue-router.mjs:3590:69

Elizabeths的博客 1298

【Kotlin】标准函数和静态方法

文章目录标准函数withrunApply定义静态方法注解顶层方法 标准函数 with with 的作用是可以在连续调用同一对象的多个方法时让代码变得更加精简 val result = with(obj){ //这里是obj的上下文 "value" //with 函数的返回值 } 看个例子,例如有一个水果列表,现在我们想吃完所有水果,并将结果打印出来 val list = listOf("Apple","Banana","Orange") val builder = StringBuilder() bu

Errol's Blog 405

kotlin中let、run、apply的区别

kotlin中let、run、apply的区别

flytosky21的博客 2485

医疗大模型实战——从零构建MedicalGPT全流程解析

本文详细解析了从零构建医疗大模型MedicalGPT的全流程实战。基于Qwen-7B模型与约195万条中文医疗数据,完整复现了增量预训练、监督微调与偏好对齐三大核心环节,并分享了如何在有限硬件资源下实现高效训练与部署,为开发者提供了可复现的医疗AI项目实战指南。

weixin_29193259的博客 553

保姆级教程如何进行本地局域网布署openclaw小龙虾

全网唯一一篇一步步实战教程,图文并茂方式的方式教你如何本地部署安装小龙虾openclaw

zzw17wei的专栏 1467

kotlin中 run、apply、let、also、with的用法和区别

run 、 apply 、 let 、 also 和 with 五个函数均位于 kotlin 包下的 Standard 文件中,其含义和用法比较相似,现分别介绍如下。 run用法1 函数定义: public inline fun run(block: () -> R): R = block() 功能:调用run函数块。返回值为函数块最后一行,或者指定return表达式。 示例: val a = run { println("run") return@run 3 } println(a) 运行结果:

hipeboy的博客 3533

基于Vivado2025的UltraScale+时序收敛优化实战案例

深入解析在Vivado2025环境中针对UltraScale+架构的时序收敛挑战,结合实际设计案例,分享关键优化策略与操作技巧,显著提升设计性能与收敛效率。vivado2025的更新特性为时序优化带来新机遇。

weixin_33660045的博客 343

你不知道的vue3:使用runWithContext实现在非 setup 期间使用inject

这篇文章我们先介绍了由于inject执行期间需要拿到当前的vue实例,然后才能从父组件提供的provides对象中找到相同key的值。如果我们在非setup期间执行,那么就拿不到当前vue实例。也找不到父组件,当然inject也没法拿到注入的值。在一些场景中我们确实需要在非setup期间执行inject,这时我们就可以使用将app对象作为注入上下文执行回调函数。然后在inject执行期间就能从app中拿到提供的provides对象中相同key的值。

qq_36348403的博客 1082

【Lammps】MS将cif通过msi2lmp.exe转为data文件

在Materials Studio中打开cif文件,在Modules工具行选择Forcite>calculation>Energy中选用cvff力场,点击more,不要运行run,在more中取消勾选calculate automatically,点击calculate,然后叉掉后在file>export导出car文件,同步生成了mdf文件。对于MS中没有的立场,选择之后点calculate会报错,右键选择label,然后根据Forcite选择原子,会发现有力场的有标号,没有力场的MS没有对选择标号。

zhangguoliang624的博客 3673

域控制器开发避坑实录:从硬件设计到软件集成的5个关键挑战

本文深入剖析了域控制器开发中的5大关键挑战,从硬件选型到软件集成,涵盖智能驾驶芯片选择、实时性优化、AUTOSAR架构适配等核心问题。通过实战案例和数据对比,为工程师提供避坑指南,助力提升开发效率和系统可靠性。

weixin_29258297的博客 395

Vue3.3发布了,有啥新特性?简单的了解下

前言虽然3.3当前还处于beta阶段但是其带来的一些特性十分激动人心,就在这里简单的给大家带来新特性的前瞻,为以后的升级做做准备????泛型组件支持Vue一直以来[1]都是没办法很好的实现泛型组件,终于在3.3版本增加了这一功能首先是面向TSX用户为defineComponent工具函数增加了泛型支持,当参数传入一个泛型函数时类型会提示正常,比如我们可以基于这个特性使用tsx简单构造一个表格组件imp...

前端达人 2641

S32DS使用完整指南:S32K CAN通信模块配置步骤

深入讲解S32DS使用过程中S32K芯片的CAN通信模块配置步骤,涵盖关键设置与常见问题。掌握s32ds使用技巧,提升开发效率,实现稳定可靠的车载网络通信。

weixin_42592399的博客 981

Kotlin - 标准函数 with、run 、apply和静态方法

1、标准函数with、run 、apply (1)with 函数 (2)run 函数 (3)apply 函数 2、定义静态方法 (1)单例类object (2)companion object (3)注解和顶层方法 ①注解 ②顶层方法

m0_54536657的博客 510

IEC 62061 总结与适用范围

IEC 62061 是国际电工委员会(IEC)制定的。

cactusDaYe的博客 1082

YOLOv11涨点改进| CVPR 2026 |独家创新首发、特征融合改进篇| 引入FAAFusion傅里叶角对准融合模块,促进高低频特征融合,增强模型在小目标、密集目标检测和旋转目标检测任务高效涨点

🔥本文提出FAAFusion傅里叶角对准融合模块,用于改进YOLOv11网络模型。该模块通过在特征金字塔融合阶段对齐高低层特征的方向信息,缓解传统FPN直接融合带来的方向冲突问题。FAAFusion利用傅里叶旋转等变性原理,在频域估计主方向并进行特征对齐,显著提升了多尺度特征表达的一致性与有效性。实验表明,该方法在DOTA等遥感数据集上取得了新的最先进水平,特别适用于旋转目标检测任务。文章详细介绍了模块原理、结构优势,并提供了三种不同的YOLOv11改进配置方案和完整的核心代码实现。

Ai缝合怪、助力小伙伴高效发论文 152

Kotlin 中 let、with、run、apply ‘标准函数 ’ 和 ‘ 静态方法 ’ 的使用

本文会介绍 部分 标准函数 和 静态方法 的使用,算是kotlin的一些高级小技巧,走起来~~ 一、let、with、run、apply let 它主要是结合 ’ ?. ’ 进行判空的辅助, 例如: var userBean:UserBean ?= null userBean?.let { //如果userBean为空,let空间的代码就不会执行了 println(it.name) } with 它主要的对代码 进行一些精简的作用,比如我们要使用一个对的对象的方法.

章鱼哥的博客 409

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Kotlin-标准函数with,run和apply及静态方法companion object,@JvmStatic和顶层方法(第一行代码Kotlin学习笔记5)

目录1. 几个标准函数1.1 with1.2 run1.3 apply2. 静态方法2.1 单例类和伴生类实现类似静态方式调用2.2 静态方法注解顶层方法 1. 几个标准函数 Kotlin中标准函数指的是Standard.kt文件中定义的函数,任何Kotlin代码都可以任意的调用所有的标准函数。上一篇文章中我们学习了let函数配合?.操作符来避免空指针引发的问题,这篇文章中我们会继续学习几个标准函数。 1.1 with with函数接收两个参数:第一个参数可以是一个任意类型的对象,第二个参数是一个Lambd

liuhp的博客 689

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

标准函数和静态方法

标准函数:with run apply 静态方法: 注解和顶层方法 with和run 用法相近 fun main(array: Array<String>){ val list = listOf("Apple","Banana","Orange","Pear","Grape") // 普通用法 val builder = StringBuilder() for (item in list){ builder.append(item).ap..

ybilss的博客 251

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

快速入门kotlin-标准函数与静态方法

标准函数 首先我们介绍标准函数 with、run、apply,如果你了解javascript,那理解kotlin的标准函数width、run、apply那简直不要太轻松。with、run、apply与javascript中的with的意义基本一模一样,只是含有一些细微差别。 with with它接收两个参数,第一个参数可以是任意类型的对象,第二个参数是一个Lambda表达式。with函数会在Lambda表达式中提供第一个对象的上下文,可以直接使用对象的属性或方法,而不需要带上对象前缀。with函数会使用La

qq_30040899的博客 441

Kotlin中的标准函数和静态方法

Kotlin中的标准函数with、run和apply和定义静态方法

ChenYiRan123456的博客 888

Kotlin进阶 —— 标准函数和静态方法

一、标准函数with、run和apply 1.with函数 with函数接收两个参数:第一个参数可以是一个任意类型的对象,第二参数Lambda表达式。with函数会在Lambda表达式中提供第一个参数对象的上下文,并使用Lambda表达式中的最后一行代码作为返回值返回。示例: val result = with(obj) { //obj的上下文 "result" //with函数的返回值 } with函数的作用就是可以在连续调用同一个对象的多个方法时,让代码变得更加精简。比如: val list =

flyzhuzhu7 364

3.7--Kotlin 课堂:标准函数和静态方法

3.7.1 标准函数 with、run和apply Kotlin 的标准函数指的是 Standara.kt 文件中定义的函数,任何Kotlin 代码都可以自由调用所有的标准函数。我们已经学习了let 标准函数 ,let 标准函数的主要作用就是配合.? 进行辅助判空处理。 下面我们学习新的 标准函数with。with 函数接收两个参数,第一个参数可以是一个任意类型的对象,第二个参数是Lambda表达式。with 函数会在Lambda 表达式中提供第一个参数对象的上下文,并使用Lambda 表达式的最后一.

优快云_DaShuiNiu的博客 333

【10】Kotlin语法进阶——标准函数和静态方法

在上面的代码中,我们通过object关键字定义了一个单例类Util。这个单例类中的方法在所有地方都可以通过类名来访问,例如Util.doAction()。虽然这里的doAction()并不是静态方法,但是我们仍然可以像Java中那样通过类名的方式直接来访问。但是单例类的写法也有一个弊端,就是单例类中的所有方法都会变成类似静态方法的调用方式。如果我们只希望让类中某一个方法变成静态方法的调用方式该怎么办呢?

熊熊饲养员的优快云! 1447

Kotlin的标准函数和静态方法

Kotlin的标准函数和静态方法

weixin_45809829的博客 545

Kotlin 标准函数和静态方法

Kotlin中提供了很多标准函数和静态方法,标准函数包括letwithrunapply和also等,这些函数主要用于简化对象操作,静态方法则常用于工具类中定义一些不依赖于实例的通用方法。合理使用这些函数和方法,一方面能提高代码的可读性,另一方面对我们的工作效率也很有帮助,本文将对常用的标准函数和静态方法以及他们常见的使用场景进行简单的总结归纳。

weixin_58719774的博客 2078
上一篇: 必备技巧(一):更方便的编写启动Activity
下一篇: Android开发:控件类型及使用
Tefuir111
博客等级 码龄7年 35粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值