Operador de asterisco de Kotlin antes del nombre de la variable o Operador de extensión en Kotlin

Quiero saber exactamente qué es asterisk antes del nombre de la variable en Kotlin. Vi esto ( *args ) en Spring boot Kotlin example :

 @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) } 

El operador * se conoce como el Operador de extensión en Kotlin.

De la reference de Kotlin …

Cuando llamamos a una function vararg, podemos pasar arguments uno por uno, por ejemplo, como Lista (1, 2, 3) o, si ya tenemos una matriz y queremos pasar su contenido a la function, usamos la extensión operador (prefija la matriz con *):

Se puede aplicar a una matriz antes de pasarla a una function que acepte varargs .

Por ejemplo…

Si tiene una function que acepta una cantidad variada de arguments …

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

Puede pasar una matriz en él así …

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

Notas:

  • El operador * es también el operador de multiplicación (por supuesto).
  • El operador de extensión solo se puede aplicar al pasar arguments a una function. El resultado de la operación no se puede almacenar ya que es azúcar puramente sintáctico.
  • El operador puede confundir algunos progtwigdores C / C ++ al principio porque parece que se está desreferencendo un puntero. No lo es; Kotlin no tiene noción de pointers .
  • El operador de propagación se puede usar entre otros arguments cuando se llama a una function vararg. Esto se demuestra en el ejemplo aquí .
  • El operador es muy similar a la function apply en varios lenguajes de functional programminges.

Además de las respuestas que fueron directamente hacia "¿qué es esto?", A menudo tiene el caso en el que tiene una List y desea pasarla a una function que espera una vararg . Para esto, la conversión es:

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

Suponiendo que el último parámetro de someFunc es vararg del mismo tipo que los elementos en la list.

Como se describe en la documentation, este es un operador extendido:

Cuando llamamos a una function vararg, podemos pasar arguments uno por uno, por ejemplo, como Lista (1, 2, 3) o, si ya tenemos una matriz y queremos pasar su contenido a la function, usamos la extensión operador (prefija la matriz con *):

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