Kotlin 标准函数和静态方法

标准函数

Kotlin 的标准函数指的是 Standard.kt 文件中定义的函数,任何 Kotlin 代码都可以自由地调用所有的标准函数

let 函数

let 函数提供了函数式 API 的编程接口,并将原始调用对象作为参数传递到 Lambda 表达式中。

with 函数

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

val result = with(obj) {
// 这里是 obj 的上下文
"value" // with 函数的返回值
}

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)

run 函数

run 函数的用法和使用场景与 with 函数类似,只是语法做了改动。run 函数通常不会直接调用,而是要在某个对象的基础上调用,只接受一个 Lambda 函数,并且会在 Lambda 表达式中提供对象的上下文,其他方面与 with 函数一样。示例代码如下:

val result = obj.run {
// 这里是 obj 的上下文
"value" // run 函数的返回值
}

可以用 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)

apply 函数

apply 函数和 run 函数极其类似,但是无法指定返回值,而是会自动返回调用对象本身。示例代码如下:

val result = obj.apply {
// 这里是 obj 的上下文
}
// result == obj

静态方法

Kotlin 极度弱化了静态方法这个概念,提供了比静态方法更好用的语法特性 —— 单例类。像工具类这种功能,在 Kotlin 中就非常推荐使用单例类的方式来实现。

让类中的某一个方法变成静态方法的调用方式使用 companion object

class Util {
fun doAction1() {
println("do action")
}

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

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

@JvmStatic 注解和顶层方法

Kotlin 提供了注解和顶层方法两种实现方式类定义真正的静态方法。

  1. 添加 @JvmStatic 注解后 Kotlin 会将方法编译成真正的静态方法,@JvmStatic 注解只能加在单例类或 companion object 中的方法上。

  2. 顶层方法指的是那些没有定义在任何类中的方法。Kotlin 编译器会将所有的顶层方法全部编译成静态方法,在 Kotlin 中调用时直接键入方法名即可,在 Java 中调用需要使用文件名.方法名

参考