web-dev-qa-db-fra.com

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 ça (*args) at exemple Kotlin pour le démarrage du printemps :

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

Le * opérateur est appelé opérateur Spread dans Kotlin.

De la référence Kotlin ...

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 que nous voulons transmettre son contenu à la fonction, nous utilisons l’opérateur spread (préfixez le tableau avec *):

Il peut être appliqué à un tableau avant de le transmettre à une fonction qui accepte varargs.

Par exemple...

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

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

Vous pouvez y passer un tableau comme si ...

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

Notes:

  • Le * opérateur est également l’opérateur de multiplication (bien sûr).
  • L'opérateur ne peut être utilisé que lors de la transmission d'arguments à une fonction. Le résultat de l'opération ne peut pas être enregistré car il ne génère aucune valeur (c'est purement sucre syntaxique).
  • L'opérateur peut confondre certains programmeurs C/C++ au début, car il semble qu'un pointeur est en train d'être dé-référencé. Ce n'est pas; Kotlin n'a aucune notion de pointeur .
  • L'opérateur peut être utilisé entre d'autres arguments lors de l'appel d'une fonction vararg. Ceci est démontré dans l'exemple ici .
  • L'opérateur est similaire à la fonction apply dans divers langages de programmation fonctionnels.
120
byxor

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 ce dernier paramètre de someFunc soit vararg du même type que les éléments de la liste.

18
Jayson Minard

Comme décrit dans la documentation c'est 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 que nous voulons transmettre son contenu à la fonction, nous utilisons l’opérateur spread (préfixez le tableau avec *):

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

Dans Java vous pouvez passer un tableau tel quel, mais il est avantageux 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 certaines valeurs fixes en un seul appel. Java ne supporte pas cela.

2
Gulzar Bhat

Si une fonction qui accepte un paramètre vararg (nombre variable d'arguments) comme:

fun sum(vararg data:Int)
{
   // function body here         
}

Maintenant, pour appeler cette méthode, nous pouvons faire:

sum(1,2,3,4,5)

Mais que se passe-t-il si nous avons ces valeurs dans un tableau, comme:

val array= intArrayOf(1,2,3,4,5)

ensuite, pour appeler cette méthode, nous devons utiliser un opérateur spread, comme:

 sum(*array)

Ici, * (opérateur de propagation) transmettra tout le contenu de ce tableau.

* array est équivalent à 1,2,3,4,5

Mais attendez une minute, si nous l'appelons comme ceci: sum(array), cela nous donnera une erreur de compilation lors de la compilation:

Type mismatch.
Required:Int
Found:IntArray

Le problème est que la fonction sum accepte un paramètre vararg Int (Qui accepte une valeur telle que: 1,2,3,4,5). Si nous passons tableau, il sera passé sous la forme IntArray.

1
Suraj Vaishnav