具名参数
顾名思义,就是在调用函数时显示指定形参的名称,这样即使实参与形参顺序不一致也没有任何影响,因为你已经明确指定了每个参数对应的形参了,例如:
fun main(args: Array<String>) {
val result1 = division(5.0,2.0)
val result2 = division(arg2 = 2.0,arg1 = 5.0)//具名参数,与顺序无关
println("result1=$result1")
println("result2=$result2")
}
fun division(arg1:Double,arg2:Double):Double{
return (arg1/arg2)
}
变长参数
变长参数类似数组,使用vararg关键字标识,同java相似,但又有区别,首先java中的变长参数只能声明在方法形参的末尾,但在kotlin中因为可以使用具名参数来调用方法,所以变长参数可以声明在形参的任意位置,如下:
fun main(args:Array<String>){
printArray(3,"H","ello"," world",arg2 = "OK")
}
fun printArray(arg1:Int,vararg array:String,arg2:String){
println("arg1=$arg1")
array.forEach (::print)
println("\narg2=$arg2")
}
另外在给变长参数传递实参时,我们也可以直接传递一个数组名,使用spread操作符
* 可以将此数组自动展开传入,如上面的代码在调用printArray方法时也可以这样写:
val s = arrayOf("H","ello"," world")
printArray(3,*s,arg2 = "OK")
运行结果跟上面是一样的。唯一不足的是截止目前操作符 * 只支持数组展开,不支持将集合展开。
默认参数
默认参数作用就是可以在调用方法时不给形参传递参数,使该参数值为方法中声明的默认值;如上面方法的声明可以写成下面的形式
fun printArray(arg1:Int=3,vararg array:String,arg2:String="OK"){
println("arg1=$arg1")
array.forEach (::print)
println("\narg2=$arg2")
}
则如果调用时是这样的:
fun main(args:Array<String>){
val s = arrayOf("H","ello"," world")
printArray(array=*s) //只给中间的可变参数赋值,其他参数自动赋值默认值
}
那么运行结果依然不变,如下