Я хочу знать, что именно звездочка делает до имени переменной в Kotlin. Я видел это ( *args
) в примере Spring Boot 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) }
Оператор *
известен как оператор распространения в Котлине.
Из справочника Котлин …
Когда мы вызываем vararg-функцию, мы можем передавать аргументы один за другим, например asList (1, 2, 3), или, если мы уже имеем массив и хотим передать его содержимое функции, мы используем спрэд оператор (префикс массива с *):
Он может применяться к массиву, прежде чем передавать его в функцию, которая принимает varargs
.
Если у вас есть функция, которая принимает множество аргументов …
fun sumNumbers(vararg numbers: Int): Int { return numbers.sum() }
Вы можете передать массив в него так …
val numbers = intArrayOf(2, 3, 4) val sum = sumNumbers(*numbers) println(sum) // Prints '9'
Заметки:
*
также является оператором умножения (конечно). В дополнение к ответам, которые были непосредственно направлены на «что это такое!?!», Вы часто имеете случай, когда у вас есть List
и вы хотите передать его функции, ожидающей vararg
. Для этого конверсия:
someFunc(x, y, *myList.toTypedArray())
Предполагая, что последний параметр someFunc
является vararg
того же типа, что и элементы в списке.
Как описано в документации, это оператор с расширением:
Когда мы вызываем vararg-функцию, мы можем передавать аргументы один за другим, например asList (1, 2, 3), или, если мы уже имеем массив и хотим передать его содержимое функции, мы используем спрэд оператор (префикс массива с *):
val a = arrayOf(1, 2, 3) val list = asList(-1, 0, *a, 4)
В Java вы можете передать массив как есть, но преимущество распаковки массива с оператором распространения *
– это то, что оператор spread позволяет объединить значения из массива и некоторые фиксированные значения в одном вызове. Java не поддерживает это.