这里,我们将学习如何将可变数量的参数传递给 Kotlin 中的函数。 此外,我们将了解 Kotlin 如何使我们能够将数组转换为 Varargs。
要将可变数量的参数传递给函数,我们应该使用 varargs
声明该函数:
fun sum(vararg xs: Int): Int = xs.sum()
这意味着 sum() 函数可以接受零个或多个整数。 例如:
val zeroNumbers = sum()
assertEquals(0, zeroNumbers)
assertEquals(2, sum(2))
assertEquals(12, sum(2, 4, 6))
如上所示,我们可以将零个或多个参数传递给可变参数。
在函数体内,我们可以将可变参数视为一个数组:
fun <T> printAll(vararg ts: T) {
ts.forEach { println(it) }
}
在上面的示例中, ts 参数可以作为函数体中的 Array
访问。 在以下示例中,类似地,它将是一个 Array
:
fun printStrings(vararg vs: String) {
vs.forEach { println(it) }
}
有时我们在 Kotlin 中有一个现有的数组实例,我们想将它传递给一个接受 vararg 的函数。 在这些情况下,要将数组分解为可变参数,我们可以使用扩展运算符:
val numbers = intArrayOf(1, 2, 3, 4)
val summation = sum(*numbers)
assertEquals(10, summation)
numbers 数组变量后面的 “*” 就是 Spread Operator(扩展运算符)。
另外一个例子:
var permissions = arrayOf(Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE)
requestEach(*permissions)
public Observable<Permission> requestEach(final String... permissions) {
return Observable.just(TRIGGER).compose(ensureEach(permissions));
}
requestEach方法是接收一个String类型的可变长度的数组,我们在外面定义了一个permissions数组之后加上星号就可以传入了。又比如:
var temp = arrayOf("1" , "2" , "3")
getItem(*temp)
fun getItem(vararg str:String){
str.forEach {
ToastUtils.showLong(it)
}
}