一、标准函数with、run和apply
1.with函数
with函数接收两个参数:第一个参数可以是一个任意类型的对象,第二参数Lambda表达式。with函数会在Lambda表达式中提供第一个参数对象的上下文,并使用Lambda表达式中的最后一行代码作为返回值返回。示例:
val result = with(obj) {
//obj的上下文
"result" //with函数的返回值
}
with函数的作用就是可以在连续调用同一个对象的多个方法时,让代码变得更加精简。比如:
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
val builder = StringBuilder()
for (fruit in list) {
builder.append(fruit).append("\n")
}
val result = builder.toString()
使用with函数,示例:
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
val result = with(StringBuilder()) {
for (fruit in list) {
append(fruit).append("\n")
}
toString()
}
上诉代码中,首先给with函数第一个参数传入了一个StringBuilder对象,那么接下来整个Lambda表达式的上下文就会是这个StringBuilder对象。于是在Lambda表达式中可以直接调用append()和toString()方法。最后返回该对象的toString()。
2.run函数
run函数的用法和使用场景和with函数非常类似,只是稍微作了一些改动。首先run函数通常不会直接调用,而是要在某个对象的基础上调用;其次run函数只接收一个Lambda表达式参数,并且会在Lambda表达式中提供调用对象的上下文,其它方面和with函数是一样的。示例:
val rusult = obj.run {
//这里是obj的上下文
"result" //run函数的返回值
}
使用run函数代替上诉with函数的例子:
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
val result = StringBuilder().run {
for (fruit in list) {
append(fruit).append("\n")
}
toString()
}
3.apply函数
apply函数和run函数也是非常类似的,都要在某个对象上调用,并且只接收一个Lambda表达式参数,也会在Lambda表达式中提供调用对象的上下文,但是apply函数无法指定返回值,而是会返回调用对象本身。示例:
val result = obj.apply {
//obj的上下文
}
//result == obj
使用apply函数代替上诉run函数的例子:
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
val resultBuilder = StringBuilder().apply {
for (fruit in list) {
append(fruit).append("\n")
}
}
val result = resultBuilder.toString()
二、静态方法
Kotlin极度弱化了静态方法的概念。类似于工具类这种功能,在Kotlin中就推荐使用单例类的方式来实现,示例:
object Util {
fun doAction() {
}
}
虽然这里的doAction()方法并不是静态方法,但是可以使用Util.doAction()的方式调用。
不过,使用单例类的写法会将整个类中的所有方法都变成类似于静态方法的调用方式。如果希望让类中的某一个方法变成静态方法的调用方式,则可以通过companion object关键字,示例:
class Util {
fun doAction1() {
}
companion object {
fun doAction2() {
}
}
}
上诉代码的doAction2方法就可以直接使用Util.doAction2()发方式调用了。不过doAction2()方法其实也并不是静态方法,companion object这个关键字实际上会在Util类的内部创建一个伴生类,而doAction2()方法就是定义在这个伴生类里面的实例方法。Kotlin会保证Util类始终只会存在一个伴生类对象。
如果需要定义真正的静态方法,Kotlin提供了两种实现方式:注解和顶层方法。
1.使用注解定义:
如果给单例类或者companion object中的方法加上@JvmStatic注解,那么编译器就会将这些方法编译成真正的静态方法,示例:
class Util {
fun doAction1() {
}
companion object {
@JvmStatic
fun doAction2() {
}
}
}
注意:
- @JvmStatic注解只能加在单例类或companion object中的方法上。
2.顶层方法
顶层方法指的是那些没有定义在任何类中的方法。Kotlin编译器会将顶层方法全部编译成静态方法。示例:
fun doSomething() {
}
所有的顶层方法都可以在任何位置被直接调用,不管包名路径,也不用创建实例,直接建入doSomething()。
如果在Java中调用上诉方法,是找不到doSomething()方法的。比如我们创建的Kotlin文件名叫Helper.kt,那么Kotlin编译器会自动创建一个叫做HelpKt的Java类,doSomething()方法是以静态方法的形式定义在该类中。
PS:
本文整理自《第一行代码 Android》第三版,笔记文章,希望对大家有所帮助!