Kotlin相比于Java
相比于java | 描述 |
---|---|
新增 | 可以有顶层函数 |
新增 | 可以有嵌套函数 |
新增 | 可以有中缀函数 |
目标
目标 | 知识点 |
---|---|
掌握 | 顶层函数的的定义和使用,以及注意事项 |
掌握 | 嵌套函数的的定义和使用,以及注意事项 |
掌握 | 中缀函数的定义和使用,以及注意事项 |
可变参数:vararg关键字
什么是可变参数?适用于参数个数不确定,类型确定的情况。kotlin把可变参数当做数组处理。同java,可变参数只能出现在参数列表的最后。Kotlin的可变参数通过vararg关键字实现。参考代码:

针对以上代码我们可以看到,被vararg修饰的变量,有size属性,可以进行遍历。
接收我们编写一个方法,测试一下可变参数只能出现在参数列表的最后这个结论,参考代码:

通过以上代码,我们验证了“可变参数只能出现在参数列表的最后”。
顶层函数
顶层函数也可以称为包级别函数,就是一个函数,可以直接放到某一个包里面,而不用一定需要放到某一个类里面。在Java里面一个方法,必须属于一个类,在Kotlin中,方法可以独立存在。其实我们之前写的很多函数都是顶层函数,比如我们的main方法:

顶层函数的定义显得自由,不受类的约束。顶层函数调用方法,如果在同一个包,直接调用即可,如果在不同包,导入对应的包就可以了。
我们写个案例验证下,先在“第2章开始.B变量和函数进阶.顶层函数1”包下定义方法“sayHello2Kotlin”,参考代码:

接着在“第2章开始.B变量和函数进阶.顶层函数2”包下定义方法“sayHello2Java”,参考代码:

接着我们在一个新文件中调用“sayHello2Kotlin”和“sayHello2Java”两个方法。

我们虽然没有写具体的类,但是其实通过查看编译转换的字节码,编译器会帮我们生成了一个类,比如我们查看“sayHello2Kotlin”方法对应的字节码,参考截图:

嵌套函数
在java里面,函数只能定义在某一个类里面,刚刚我们说了,方法可以直接定义在一个包里面,独立于一个类存在。除此之外,方法里面还可以还可以定义方法。这样的方法称为嵌套方法。
假如我们有这样一个场景,保存用户之前需要校验用户名和密码是否为空。如果不使用嵌套函数,我们可以这样实现,参考代码:

针对检验方法“validate”,我们这里使用的是顶层函数的形式,放在了最外面。接着我们把该方法直接挪动到saveUser方法里面,参考代码:

针对以上代码,发现方法定义挪动了某一个方法里面同样是可以的。
中缀函数
一个函数为成员函数或者拓展函数,并且只有一个参数,并且使用infix修饰。在进行函数调用的时候可以使用中缀方式调用,参考代码:

网友评论
val strA = "A"
val strB = "B"
if (strA sameAs strB) {//中缀调用 sameAs
println("str is the same")
} else {
println("str is the differ")
}
}
infix fun String.sameAs(strB: String) = String.equals(strB)//写在最高层中,顶层+中缀,感觉有点实用...