
2.1.1 函数的参数
Kotlin函数的参数使用Pascal表示法定义,即name:type。参数之间采用逗号隔开,示例如下:

1.默认参数
默认参数是指函数中的参数可以包含默认值。当省略某参数时,即采用默认值。
与Java相比,使用默认参数可以减少方法重载的数量。例如下面的代码:

如果不传参数的话,就会使用默认的参数:
RxJavaUtils.preventDuplicateClicksTransformer()
这段代码还包含两个注解:
· @JvmStatic:表示该方法为静态方法。Kotlin可以为对象声明或者伴生对象中定义的函数使用@JvmStatic(上述例子RxJavaUtils即为对象声明,对象声明和伴生对象会在2.3节详细介绍)。
· @JvmOverloads:使用了默认参数之后,可以避免重载。但是Java却无法调用,因为对Java而言只会对一个方法可见,它是所有参数都存在的完整参数签名的方法。如果希望向Java调用者暴露多个重载,可以使用@JvmOverloads注解。
如果不使用@JvmOverloads,上述Kotlin代码相当于下面的Java代码:

因此,无法使用默认参数。如果想在Java中调用含有默认参数的方法,可使用如下代码:
RxJavaUtils.preventDuplicateClicksTransformer();
必须在原先的preventDuplicateClicksTransformer方法上标注@JvmOverloads。
2.命名参数
对于下面的函数:
fun sum(x: Int=0, y: Int): Int { return x + y }
如果想使用默认参数,可以这样:
sum(y=2) //相当于sum(0,2)
这里y=2使用了命名参数,显式地指定参数y的值。
我们在使用默认参数时,可以指定某个参数的值。例如下面的函数:
fun sum(x: Int, y: Int=0,z: Int=1): Int { return x + y + z }
如果只想让参数y使用默认值,那么可以这样使用:
sum(1,z=5) //相当于sum(1,0,5)
在一个函数调用中,如果包含位置参数和命名参数,那么所有位置参数都要放在第一个命名参数之前。
3.可变数量的参数
Kotlin的可变参数与Java的可变参数类似,但是Kotlin需要对参数使用vararg进行修饰。
Kotlin的可变参数一般是函数的最后一个参数,例如:

toList()也可以传递数组,不过不能像Java那样直接传递数组。需要使用展开运算符“*”(在参数名前加“*”),它表示解包数组,能够让数组中的每个元素在函数中被作为单独的参数。

如果可变参数不是函数的最后一个参数,那么后面的参数需要通过命名参数来传值:
