variables名称前的Kotlin星号运算符或Kotlin中的Spread运算符

我想知道在Kotlin中variables名称前面的星号是什么。 我在Spring引导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) { SpringApplication.run(Application::class.java, *args) } 

*运算在Kotlin中称为Spread运算符

从Kotlin参考 …

当我们调用可变参数函数的时候,我们可以逐个传递参数,比如asList(1,2,3),或者如果我们已经有一个数组并且想把它的内容传给函数,我们使用spread操作符(以*为前缀):

在将数组传递给接受varargs的函数之前,它可以应用于数组。

例如…

如果你有一个接受不同数量参数的函数

 fun sumNumbers(vararg numbers: Int): Int { return numbers.sum() } 

你可以像这样传递数组

 val numbers = intArrayOf(2, 3, 4) val sum = sumNumbers(*numbers) println(sum) // Prints '9' 

笔记:

  • *运算符也是乘法运算符 (当然)。
  • Spread运算符只能在将parameter passing给函数时应用。 操作的结果不能被存储,因为它是纯粹的语法糖。
  • 一开始,操作员可能会混淆一些C / C ++程序员,因为它看起来像一个指针正在被取消引用。 不是; 科特林没有指针的概念
  • 调用可变参数函数时,可以在其他参数之间使用扩展运算符。 这个例子在这里演示。
  • 在各种函数式编程语言中,运算符与apply函数非常相似。

除了直接针对“这是什么东西!?!”的答案之外,你经常会遇到这样的情况:你有一个List并且想把它传递给一个期待vararg的函数。 为此,转换是:

 someFunc(x, y, *myList.toTypedArray()) 

假设someFunc最后一个参数是与列表中的元素相同types的vararg参数。

如文档中所述,这是一个分布式运算符:

当我们调用可变参数函数的时候,我们可以逐个传递参数,比如asList(1,2,3),或者如果我们已经有一个数组并且想把它的内容传给函数,我们使用spread操作符(以*为前缀):

 val a = arrayOf(1, 2, 3) val list = asList(-1, 0, *a, 4) 

在Java中,您可以按原样传递一个数组,但使用扩展运算符*解开一个数组的优点是扩展运算符允许您在一次调用中组合数组中的值和一些固定值。 Java不支持这个。