kotlin快速入门之标准函数与静态方法
标准函数
首先我们介绍标准函数 with、run、apply,如果你了解javascript,那理解kotlin的标准函数width、run、apply那简直不要太轻松。with、run、apply与javascript中的with的意义基本一模一样,只是含有一些细微差别。
with
with它接收两个参数,第一个参数可以是任意类型的对象,第二个参数是一个Lambda表达式。with函数会在Lambda表达式中提供第一个对象的上下文,可以直接使用对象的属性或方法,而不需要带上对象前缀。with函数会使用Lambda表达式中的最后一行代码作为返回值返回。
val result = with(obj) {
// 这里是obj的上下文环境
doSomething() // 调用obj的doSomething方法,无需 obj.doSomething() 这种形式调用
}
run
run函数的用法与使用场景和with函数非常类似,只是做了些许改动。run函数无法直接调用,他需要在某个对象的基础上去调用它;其次run函数值接收一个Lambda表达式作为参数,并且会在Lambda表达中提供调用对象的上下文,同样将Lambda表达式中的最后一行代码作为返回值。
val result = obj.run {
// 这里是obj的上下文环境
doSomething() // 调用obj的doSomething方法,无需 obj.doSomething() 这种形式调用
}
apply
apply函数和run函数在用法上基本一模一样,唯一区别是apply函数不会将Lambda表达式中的最后一行作为参数返回,而是会返回对象本身.
val result = obj.apply {
// 这里是obj的上下文环境
doSomething() // 调用obj的doSomething方法,无需 obj.doSomething() 这种形式调用
}
// result == obj
静态方法
在java中定义一个静态方法如下:
public class Util {
public static void doSome() {
// todo
}
}
// 使用静态方法
Util.doSome()
而Kotlin提供了几种方式去实现类似java中的静态方法
单例类实现静态方法
// 声明一个单例类
object Util {
fun doSome() {
// todo
}
}
// 使用
Util.doSome()
伴生类实现静态方法
单例类的写法会让类中的所有方法全部变成了类似静态方法的调用形式,如果我们只是希望类中的某些方法变成静态方法的调用形式怎么办呢?kotlin给我们提供了伴生类 companion object。
class Utl {
companion obj {
fun doSome() {
// todo
}
}
}
// 使用
Util.doSome()
这个关键字实际会在Util类的内部创建一个伴生类,Kotlin会保证一个类中只会存在一个伴生类对象,调用Util.doSome()实际上是调用Util类中的伴生类对象的doSome方法。
注解实现静态方法
如果我们确确实实需要定义真正的静态方法,我们可以给单例类或companion object伴生类中的方法加上 @JvmStatic注解,那么kotlin编译器就会将这些方法编译成真正的静态方法。注意这个注释一般加在单例类或伴生类的方法上,如果加在普通方法上,会直接提示语法错误。
class Utl {
companion obj {
@JvmStatic
fun doSome() {
// todo
}
}
}
// 使用
Util.doSome()
顶层方法实现静态方法
顶层方法指的是哪些没有定义在任何类中的方法,比如我们编写的main()方法。kotlin编译器会将所有的顶层方法全部编译成静态方法。所有的顶层方法在任何位置可以直接被调用,不用管包名路径,也不用创建实例。但如果这个方法在Java代码中调用,需要加上该方法所在的文件名。
// 如我们在Tool.kt 文件中创建了一个顶层方法
// Tool.kt
fun doSome() {
// todo
}
// 在java代码中使用
public class JavaTest {
public void invokeStaticFunc() {
// 文件名+方法形式调用顶层方法
Tool.doSome()
}
}
总结
到此这篇关于kotlin快速入门之标准函数与静态方法的文章就介绍到这了,更多相关kotlin标准函数与静态方法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341