- , 5 11月 2022
- 作者 847954981@qq.com
- 后端学习, 我的编程之路
Kotlin安卓开发学习-标准函数和静态方法
Kotlin的标准函数指的是Standard.kt文件中定义的函数,任何Kotlin代码都可以自由地调用所有的标准函数。其最主要使用的是with、run和apply这三个函数。
with函数会在Lambda表达式中提供第一个参数对象的上下文,并使用Lambda表达式中的最后一行代码作为返回值返回。具体如下:
代码语言:javascript复制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类似,但确是建立在某个对象上的调用:
代码语言:javascript复制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,不会将最后一行作为返回值,而是直接返回对象本身:
代码语言:javascript复制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提供了比静态方法更好的语法特性–单例类。
代码语言:javascript复制object Util {
fun doAction() {
println("do action")
}
}
在Kotlin中,我们可以通过在单例类内创建方法,并在之后的代码中使用 object.method()如同静态方法调用的样子来调用这些方法。
但如果我们单纯想要某些方法变成静态方法调用格式呢?可以使用companion object{}来完成:
代码语言:javascript复制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:
代码语言:javascript复制companion object {
@JvmStatic
fun doAction2() {
println("do action2")
}
}
注意的是,@JvmStatic注解只能加在单例类或companion object中的方法上,如果你尝试加在一个普通方法上,会直接提示语法错误。
除了添加注解来实现静态方法,Kotlin也能使用顶层方法来实现效果。
顶层方法指的是那些没有定义在任何类中的方法。比如我们创建一个新的Kotlin文件,并在内部直接写入方法,那么这个方法就是顶层方法。Kotlin编译器会将所有的顶层方法全部编译成静态方法,而调用只需要类名 顶层方法名即可。