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)
}
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
.
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:
*
opérateur est également l’opérateur de multiplication (bien sûr).apply
dans divers langages de programmation fonctionnels.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.
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)
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.
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
.