166 votes

Opérateur astérisque Kotlin avant nom de variable ou opérateur Spread dans Kotlin

Je veux savoir ce que fait exactement l'astérisque avant le nom de la variable dans Kotlin. J'ai vu cela ( *args ) à l' exemple de la botte Spring Kotlin :

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

285voto

byxor Points 2309

L' * opérateur est connu comme la Propagation de l'Opérateur dans Kotlin.

À partir de la Kotlin de Référence...

Lorsque nous appelons un vararg-fonction, on peut passer des arguments un par un, par exemple, asList(1, 2, 3), ou, si nous avons déjà un tableau et que vous souhaitez transmettre à son contenu de la fonction, nous utilisons la propagation de l'opérateur (préfixe de la table avec *):

Il peut être appliqué à un Tableau avant de passer à une fonction qui accepte varargs.

Par Exemple...

Si vous avez une fonction qui accepte un nombre varié d'arguments...

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

Vous pouvez passer un tableau en elle comme si...

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

Notes:

  • L' * - opérateur est également l' opérateur de multiplication (de cours).
  • L'opérateur ne peut être utilisé lors du passage d'arguments à une fonction. Le résultat de l'opération ne peut pas être stockée car il donne pas de valeur (c'est purement syntaxique de sucre).
  • L'opérateur peut confondre certains programmeurs C/C++ au premier abord car il ressemble à un pointeur est une dé-référencé. Il n'est pas; Kotlin a pas de notion de pointeurs.
  • L'opérateur peut être utilisé entre autres arguments lors de l'appel d'un vararg fonction. Ceci est démontré dans l'exemple ici.
  • L'opérateur est similaire à l' apply fonctionner dans différents langages de programmation fonctionnelle.

35voto

Jayson Minard Points 5925

En plus des réponses qui visaient directement "qu'est-ce que c'est que ça??!", Vous avez souvent le cas où vous avez un List et que vous voulez le transmettre à une fonction qui attend un vararg . Pour cela, la conversion est:

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

En supposant que le dernier paramètre de someFunc est vararg du même type que les éléments de la liste.

13voto

miensol Points 1889

Comme décrit dans la documentation, il s’agit d’un opérateur de propagation:

Lorsque nous appelons une fonction vararg, nous pouvons passer les arguments un par un, par exemple asList (1, 2, 3), ou, si nous avons déjà un tableau et voulons lui transmettre son contenu, nous utilisons la propagation opérateur (préfixez le tableau avec *):

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

7voto

Gulzar Bhat Points 205

En Java, vous pouvez passer un tableau tel quel, mais l’avantage de décompresser un tableau avec l’opérateur spread * est que cet opérateur vous permet de combiner les valeurs d’un tableau et de certaines valeurs fixes en un seul appel. Java ne supporte pas cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X