Kotlin安卓开发学习-标准函数和静态方法

Kotlin的标准函数指的是Standard.kt文件中定义的函数,任何Kotlin代码都可以自由地调用所有的标准函数。其最主要使用的是with、run和apply这三个函数。

with函数会在Lambda表达式中提供第一个参数对象的上下文,并使用Lambda表达式中的最后一行代码作为返回值返回。具体如下:

val result = with(obj) {
    // 这里是obj的上下文
    "value" // with函数的返回值
}
//具体例子
//打印水果
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
val result = with(StringBuilder()) {
     append("Start eating fruits.\n")
     for (fruit in list) {
         append(fruit).append("\n")
     }
     append("Ate all fruits.")
     toString()
}
println(result)

这里可以看出,我们在with内传入一个对象StringBuilder(),之后with内方法相当于依次调用了StringBuilder().append(), 循环StringBuilder().append()等等,之后通过一个最后一行的StringBuilder().toString()返回了整个字符串。

之后是run函数,与with类似,但确是建立在某个对象上的调用:

val result = obj.run {
    // 这里是obj的上下文
    "value" // run函数的返回值
}
//具体例子
//打印水果
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
val result = StringBuilder().run {
    append("Start eating fruits.\n")
    for (fruit in list) {
       append(fruit).append("\n")
    }
    append("Ate all fruits.")
    toString()
}
println(result)

这里可以看出,run与with的不同点在于,run不需要引入参数而是直接作用于对象。

最后是apply,它与run使用方式类似,但不同于run和with,不会将最后一行作为返回值,而是直接返回对象本身:

val result = obj.apply {
    // 这里是obj的上下文
}
// result == obj
//具体例子
//打印水果
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
val result = StringBuilder().apply {
     append("Start eating fruits.\n")
     for (fruit in list) {
         append(fruit).append("\n")
     }
     append("Ate all fruits.")
}
println(result.toString())

这里可以看出,apply之后没有再使用toString()方法,因为对象返回的调用对象本身,所以toString()没用,而是在之后使用。

熟练使用这些函数,能够更快地完成数据的解析方法。

静态方法

在编程中,静态方法是很重要的一环。但Kotlin弱化了静态方法这个概念,因为kotlin提供了比静态方法更好的语法特性–单例类。

object Util {
    fun doAction() {
        println("do action")
    }
}

在Kotlin中,我们可以通过在单例类内创建方法,并在之后的代码中使用 object.method()如同静态方法调用的样子来调用这些方法。

但如果我们单纯想要某些方法变成静态方法调用格式呢?可以使用companion object{}来完成:

class Util {
    fun doAction1() {
        println("do action1")
    }
    companion object {
        fun doAction2() {
            println("do action2")
        }
    }
}

不过,doAction2()方法其实也并不是静态方法,companion object这个关键字实际上会在Util类的内部创建一个伴生类,而doAction2()方法就是定义在这个伴生类里面的实例方法。只是Kotlin会保证Util类始终只会存在一个伴生类对象,因此调用Util.doAction2()方法实际上就是调用了Util类中伴生对象的doAction2()方法。

但上诉方法本质上并不是静态方法,当我们在java中以静态方法的形式调用这些类时,会发现这些方法并不存在。而如果我们想要真正将方法变成静态方法,需要加入注解-@JvmStatic:

companion object {
    @JvmStatic
    fun doAction2() {
        println("do action2")
    }
}

注意的是,@JvmStatic注解只能加在单例类或companion object中的方法上,如果你尝试加在一个普通方法上,会直接提示语法错误。

除了添加注解来实现静态方法,Kotlin也能使用顶层方法来实现效果。

顶层方法指的是那些没有定义在任何类中的方法。比如我们创建一个新的Kotlin文件,并在内部直接写入方法,那么这个方法就是顶层方法。Kotlin编译器会将所有的顶层方法全部编译成静态方法,而调用只需要类名+顶层方法名即可。