Kotlin进阶实战
上QQ阅读APP看书,第一时间看更新

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那样直接传递数组。需要使用展开运算符“*”(在参数名前加“*”),它表示解包数组,能够让数组中的每个元素在函数中被作为单独的参数。

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