基础语法
普通函数
Kotlin 中声明一个函数的基本语法如下:
fun max(a: Int, b: Int): Int{
return if (a > b) a else b;
}
说明:
- max 为参数名称
- a 和 b 为参数列表
- 花括号前的 Int 为函数返回类型,用 Unit 或者直接省略时表示函数返回类型为空
表达式函数体
当函数的函数体是由单个表达式构成的时候,可以省略花括号和 return 语句,示例如下:
fun max(a: Int, b: Int): Int = if (a > b) a else b
“静态函数”
与 Java 使用关键字来表示静态函数不同,Kotlin 的类不能拥有静态成员,而是使用伴生对象的概念,其具体实现示例如下:
companion object{
fun max(a: Int, b: Int): Int = if (a > b) a else b
}
被 companion object 标记的成员与 Java 里的静态成员类似。
进阶使用
命名参数
对于下面的 test 函数:
fun test(a: String, b: String, c: String, d: String){
}
普通调用方式是:
test("a", "b", "", "")
但是在函数参数较多时此种调用方式可读性较差,因此可以使用以下的调用方式:
test("a", "b", c = "", d = "")
注:通过显示地表明一些参数的名称可以提高代码可读性,但是在指明一个参数名称之后,该参数后面的所有参数都需要标明名称。
默认参数值
在 Kotlin 中可以通过给函数参数设置默认值来减少函数重载的情况,示例如下:
fun test(a: String = "",
b: String = "",
c: String = "",
d: String = ""){
}
此时可以用所有参数来调用这个函数,也可以省略部分参数,示例如下:
test("a")
test("a", "b")
test("a", "b", "c")
test("a", "b", "c", "d")
顶层函数
顶层函数实际上类似于 Java 中的静态函数,示例如下:
在 test.kt 文件中有:
package mytest
fun test(a: String){
}
其在 Java 中会被编译为以下代码:
/* Java */
package mytest;
public class TestKt {
public static void test(String a){
}
}
因此在 Java 中可以像调用静态函数一样调用此方法:
/* Java */
import mytest.TestKt;
...
TestKt.test("a");
修改文件类名
通过添加@JvmName
注解可以修改包含 Kotlin 顶层函数的生成的类的名称,示例如下:
在 test.kt 文件中有:
@JvmName("MyFunction")
package mytest //包名写在注解之后
fun test(a: String){
}
此时可以这样调用这个函数:
/* Java */
import mytest.MyFunction;
...
MyFunction.test("a");
扩展函数
扩展函数即是定义在类外面的类成员函数,示例如下:
package strings
fun String.lastChar(): Char = this.get(this.length - 1)
此处 String 为接收者类型,this 为接收者对象(可省略),此时即可像调用类的普通成员函数一样调用此函数。
导入扩展函数
- 方法一:单个导入
import strings.lastChar
val c = "Kotlin".lastChar()
- 方法二:整体导入
import strings.*
val c = "Kotlin".lastChar()
- 方法三:使用关键字 as 来修改导入的类或者函数的名称
import strings.lastChar as last
val c = "Kotlin".lastChar()
在 Java 中调用扩展函数
假设上述函数声明在 StringUtil.kt 文件中,示例如下;
/* Java */
char c = StringUtilKt.lastChar("Java");
可变参数
可变参数即是让函数支持任意数量的参数,通过用 vararg 修饰符实现,示例如下:
fun listOf<T>(vararg values: T): List<T> {
...}
此时的参数个数可以为任意数量:
val list = listOf(2, 3, 5, 7)
当需要传递的参数已经包含在数组中时,要显示地解包数组,以便每个数组元素在函数中能作为单独的参数调用,具体实现方式是在对应的参数前面放一个 *,示例如下:
fun main(args: Array<String>) {
val list = listOf("args: ", *args)
println(list)
}