我想知道Kotlin中变量名之前asterisk究竟是做什么的。
我在Spring boot Kotlin example看到了这个(*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)
}
答案 0 :(得分:108)
*
运算符在Kotlin中称为 Spread运算符。
来自Kotlin Reference ...
当我们调用vararg函数时,我们可以逐个传递参数,例如: asList(1,2,3),或者,如果我们已经有一个数组并希望将其内容传递给函数,我们使用扩展运算符(数组前缀为*):
在将数组传递给接受varargs
的函数之前,它可以应用于数组。
如果你有一个接受不同数量参数的函数......
fun sumNumbers(vararg numbers: Int): Int {
return numbers.sum()
}
你可以像这样将数组传递给它......
val numbers = intArrayOf(2, 3, 4)
val sum = sumNumbers(*numbers)
println(sum) // Prints '9'
备注:强>
*
运算符也是乘法运算符(当然)。apply
函数。答案 1 :(得分:18)
除了直接针对&#34的答案之外,这是什么东西!?!&#34;,你经常会遇到List
并希望将其传递给函数的情况期待vararg
。为此,转换为:
someFunc(x, y, *myList.toTypedArray())
假设someFunc
的最后一个参数是vararg
,其类型与列表中的元素相同。
答案 2 :(得分:9)
如the documentation所述,这是一个传播运营商:
当我们调用vararg函数时,我们可以逐个传递参数,例如: asList(1,2,3),或者,如果我们已经有一个数组并希望传递它 函数的内容,我们使用扩展运算符(数组前缀) 与*):
val a = arrayOf(1, 2, 3) val list = asList(-1, 0, *a, 4)
答案 3 :(得分:1)
在Java中,您可以按原样传递数组,但使用扩展运算符*
解压缩数组的优点是,扩展运算符允许您在一次调用中组合数组中的值和一些固定值。 Java不支持这一点。
答案 4 :(得分:1)
如果函数接受vararg(可变参数数目)参数,例如:
fun sum(vararg data:Int)
{
// function body here
}
现在可以调用此方法了,
sum(1,2,3,4,5)
但是,如果我们在数组中具有这些值,该怎么办?
val array= intArrayOf(1,2,3,4,5)
然后,要调用此方法,我们必须使用传播运算符,例如:
sum(*array)
这里,*(扩展运算符)会将所有内容传递给该数组的内容。
* array 等效于 1,2,3,4,5
但是请稍等,如果我们这样称呼它:sum(array)
它会给我们类型不匹配的编译时间错误:
Type mismatch. Required:Int Found:IntArray
问题是sum
函数接受一个vararg Int
参数(该参数接受像1,2,3,4,5这样的值),如果我们传递数组,它将作为{{1 }}。