官网
定义
fun关键字进行定义。
参数
name: type。
参数默认值
每一个参数都可以有默认值。如:
fun main(args:Array<String>){
println(test(2))
}
fun test(a:Int,b:Int = 3):Int{//b的默认值是3,所以调用的时候可以只传一个值,该值会被赋值给a。
return a+b
}
参数名=值的方式为指定的参数进行赋值。如:
fun main(args:Array<String>){
reformat("hhh",wordSeparator="xxx")//为指定的参数进行赋值
}
fun reformat(str:String,
divideByCamelHumps:Boolean = false,
wordSeparator:String = "_"
){
println(str+wordSeparator+divideByCamelHumps)//hhhxxxfalse
}
reformat定义了三个参数,后面两个无默认值。在调用的时候,通过参数名为指定的wordSeparator参数进行赋值;而divideByCamelHumps没有被赋值,所以它的值是默认值。
可变参数vararg
vararg关键字定义可变参数。可以将可变参数当作一个数组进行处理。要注意的是:一个函数只能有一个可变参数。但可变参数不一定是最后一个参数。如下:
fun test(vararg a:String,b:String){
for(t in a){
println(t)
}
println(b)
}
test("fdaf","fdaf2","fda3",b="00fdaf")//调用方式
参数a为可变参数,但它并不是第一个参数。
在调用时,通过参数名=值的方式为参数b进行赋值,不然赋的值会传递到可变参数a中。
将上述kt文件编译成的class打开,可发现该函数对应的java代码如下:
从中可以看出,可变参数a已经变成了String数组。
泛型
通过<>指定泛型类型,并且泛型写在函数名之前。
函数
infix notation
可以通过infix关键字定义一个函数,它需要满足以下条件:
1,必须是成员函数或扩展函数
2,必须是单参数的函数
infix关键字。如下:
fun main(args:Array<String>){
println("11".test("22"))
}
infix fun String.test(a:String):String{
return this+a //使用this代表调用者的值
}
该功能相当于为String类型扩展了功能,每一个String类型都可以直接使用test函数。
一定要在函数名之前指定要扩展功能的类。查看其对应的class文件如下:
可以看出$receiver是String类型的,该类型就是函数名之前指定的类型。
top level函数
不需要将函数定义在一个类中(这样的函数叫top level函数),它可以直接定义到任何一个kt文件中——外层不需要包裹一层class。当然,这只是写法的区别,实际上在转成class文件之后,该函数依旧是一个类的成员函数。如下是一个a.kt的源码:
fun main(args:Array<String>){
test("fdaf","fdaf2","fda3",b="00fdaf")
}
fun test(vararg a:String,b:String){
for(t in a){
println(t)
}
println(b)
}
test与main函数是没有定义到任何类的内部,打开该文件编译成的class文件,如下:
可以发现在对应的java文件中,在外层生成了一个类名为AKt的类,并将所有的函数都定义到该类中。
局部函数(local function)
一个函数可以定义在另一个函数的内容。如下:
fun test(vararg a:String,b:String){
fun inner(i:String){//定义在另一个函数的内容
println(i+","+b)
}
inner("___inner__")//直接调用该内容函数
}
查看其对应的class文件,可发现内部函数会被转成Lambda对象的成员函数。如下:
从中也可以看出,局部函数也只有其外层的函数可以访问到,别的地方无法访问。
成员函数
函数可以定义在一个类的内部。同java一样。
单语句函数
当函数体只有一个表达式时,可以省略大括号,并将函数体定义在返回类型后面,并通过等号连接。如下:
fun test(a:Int,b:Int = 3):Int = a*b
该函数的函数体只有一个表达式a*b,所以可以将大括号省略,并用等号连接。
同时,该函数的返回值类型也可以省略。如下:
fun test(a:Int,b:Int = 3) = a*b//省略了返回值类型
单语句函数不需要写return。
返回值
返回值写在参数括号后面,以冒号分开。如下:
fun test(a:Int,b:Int = 3):Int{//返回Int类型
return a+b
}
没有返回值,可以将它返回值类型写成Unit,并且该返回值类型可以省略。