标准函数

标准函数是定义在Standard.kt文件中的函数,任何kotlin代码都可以使用标准函数。

with

with函数接收两个参数,第一个参数是任意类型的对象,第二个参数是一个Lambda表达式。with函数会在Lambda表达式中提供第一个参数对象的上下文,Lambda表达式的最后一行作为返回值返回。

val result=with(obj){
    //此处为obj的上下文
    "value" //with函数的返回值
}

常用于对某一个对象要反复进行操作的场景,如下述案例,就避免了反复调用builder.append和builder.toString()方法

val list=listOf("a","b","c","d");
val result=with(StringBuilder()){
    //现在此处是StringBuilder()的上下文
    append("Start eating fruits.\n")
    for(fruit in list){
        append(fruit).append("\n")
    }
    append("End")
    toString()
}

run

  • run函数是不能直接调用的,必须要调用某个对象的run函数才可以;

  • run函数只接受一个Lambda参数,并且会在Lambda表达式中提供调用对象的上下文;

  • 表示式最后一行也作为返回值。

所以上述示例按照run方法可以写成:

val list=listOf("a","b","c","d");
val result=StringBuilder().run{
    //现在此处是StringBuilder()的上下文
    append("Start eating fruits.\n")
    for(fruit in list){
        append(fruit).append("\n")
    }
    append("End")
    toString()
}

apply

  • apply函数是不能直接调用的,必须要调用某个对象的apply函数才可以;

  • apply函数只接受一个Lambda参数,并且会在Lambda表达式中提供调用对象的上下文;

  • apply函数不会指定返回值,而是会返回调用对象本身

所以上述示例按照apply方法可以写成:

val list=listOf("a","b","c","d");
val result=StringBuilder().apply{
    //现在此处是StringBuilder()的上下文
    append("Start eating fruits.\n")
    for(fruit in list){
        append(fruit).append("\n")
    }
    append("End")
}
//注意由于apply方法无法指定返回值,所以result为StringBuilder对象
//后续输出string的时候需要result.toString()

with、run、apply使用的场景十分类似,但三者间存在细微的差别。这三个函数常用在启动Activity的时候

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

定义静态方法

静态方法也叫类方法,是指不需要创建实例就能调用的方法,静态方法非常适合一些工具类的编写,不用创建出具体的实例,就可以调用工具类的功能。

在java中定义静态方法:

public class Utils{
    public static void doAction(){
        //具体的操作
    }
}

//调用时
Utils.doAction()

在kotlin中弱化了静态方法这个概念,没有直接定义静态方法的关键字。像是上述工具类的场景kotlin更推荐用单例来实现

object Utils{
    fun doAction(){
        //具体的操作
    }
}
//虽然doAction()不是静态方法,但依旧可以通过Utils.doAction()调用

使用单例类会将这个类里面所有的方法变成类似于静态方法的调用方式,如果我们只想让部分方法变成静态方法的调用方式,可以使用companion object 伴生类

class Utils{
    fun doAction1(){
        
    }
    
    companion object{
        fun doAction2(){
        
        }
    }
}

在此时如果要调用doAction1()必须要创建Utils实例,但是调用doAction2()直接使用Utils.doAction2()即可。

companion object关键字会在Utils类内部创建一个伴生类,doAction2()就是定义在伴生类中的实例方法,kotlin会保证在Utils类内部始终只会存在一个伴生对象,因此调用了doAction2()实际上是调用了Utils类中伴生对象的doAction2()方法

如果真正地需要定义静态方法:

  • 方法一:加@JvmStatic注解。

注意该注解只能加载单例类或者companion object中的方法上,加上该注解Kotlin编译器就会把这个方法编译成真正的静态方法

class Utils{
    fun doAction1(){
        
    }
    companion object{
        @JvmStatic
        fun doAction2(){
        
        }
    }
}
  • 方法二:顶层方法

顶层方法创建的时候需要选择创建类型为File,常用于定义项目中的一些扩展函数(Kotlin 的扩展函数允许在不修改原有类的情况下,为类添加新的函数。它不会侵入原始类,而是通过静态方式(编译时解析)提供额外的功能。)

fun ClassName.newFunctionName(params): ReturnType {
    // 函数体,可以使用 this 访问接收者对象(ClassName 的实例)
}

// 为 String 添加一个扩展函数
fun String.addExclamation(): String {
    return "$this!"  // this 指向当前 String 对象
}
// 调用
val greeting = "Hello".addExclamation()  // 输出 "Hello!"

顶层方法是指那些没有被定义在任何类中的方法,Kotlin编译器会将所有顶层方法编译成静态方法。所有顶层方法都可以在任何位置被直接调用,不用创建实例,也不用管路径包名。

但是在Java中没有顶层方法的概念,无法直接使用顶层方法,所以Kotlin编译器会自动创建一个对应的java文件(例如顶层方法定义在Helper.kt文件下,kotlin编译器就会生成HelperKt.java类,可以通过HelperKt.XXX()调用方法)

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐