我想知道 Kotlin 中变量名之前的星号到底做什么。 我在
Spring boot Kotlin 示例中看到了这个(
*args
):
@SpringBootApplication
open class Application {
@Bean
open fun init(repository: CustomerRepository) = CommandLineRunner {
repository.save(Customer("Jack", "Bauer"))
repository.save(Customer("Chloe", "O'Brian"))
repository.save(Customer("Kim", "Bauer"))
repository.save(Customer("David", "Palmer"))
repository.save(Customer("Michelle", "Dessler"))
}
}
fun main(args: Array<String>) {
SpringApplication.run(Application::class.java, *args)
}
*
运算符在 Kotlin 中称为 Spread Operator。
来自 Kotlin 参考:
当您调用
函数时,您可以单独传递参数,例如vararg
。如果您已经有一个数组并希望将其内容传递给函数,请使用展开运算符(在数组前面加上asList(1, 2, 3)
前缀):*
它可以应用于数组,然后将其传递给接受
vararg
的函数。
如果您有一个接受不同数量参数的函数...
fun sumOfNumbers(vararg numbers: Int): Int {
return numbers.sum()
}
使用扩展运算符将数组的元素作为参数传递:
val numbers = intArrayOf(2, 3, 4)
val sum = sumOfNumbers(*numbers)
println(sum) // Prints '9'
备注:
*
运算符也是乘法运算符(当然)。vararg
函数时,可以在 其他参数之间使用该运算符。此处的示例对此进行了演示。
apply
函数。
List
并希望将其传递给需要
vararg
的函数。 为此,转换为:
someFunc(x, y, *myList.toTypedArray())
假设
someFunc
的最后一个参数是与列表中元素类型相同的
vararg
。
当我们调用可变参数函数时,我们可以一一传递参数,例如 asList(1, 2, 3),或者,如果我们已经有一个数组并且想要传递它 函数的内容,我们使用扩展运算符(前缀数组 带*):
val a = arrayOf(1, 2, 3) val list = asList(-1, 0, *a, 4)
Variable number of arguments)参数的函数,如下所示:
fun sum (vararg data: Int) {
// function body here
}
我们可以用调用这个方法
sum(1,2,3,4,5)
但是如果我们在数组中有相同的值,例如:
val array = intArrayOf(1,2,3,4,5)
然后,我们可以使用扩展运算符来调用此方法,例如:
sum(*array)
这里,*(扩展运算符)会将数组的所有内容传递给函数。
*但是像这样的电话:数组相当于1,2,3,4,5
sum(array)
会给我们类型不匹配编译时错误:
Type mismatch.
Required:Int
Found:IntArray
这是因为数组 sum(array)
将作为
IntArray
传递,但此调用
sum(*array)
会将数组的内容传递给函数。
*
解包数组的一个优点是扩展运算符允许您在一次调用中组合数组中的值和一些固定值。 Java 不支持这个。