Intereting Posts
Как указать параметр типа, который я не знаю Можно ли анализировать кодовое покрытие Android Kotlin с помощью SonarQube? Использование класса Kotlin в Java: не удается найти символ Возвращать двойной индекс элемента коллекции при повторении Невозможно ли установить ожидания на ленивом свойстве? Равенство идентичности для аргументов типов Int и Int устарело Kotlin DSL для создания объектов json (без создания мусора) Выражения объекта Kotlin: пример компаратора Вставить или добавить элемент в ArrayList в Котлин? Как использовать стек в Котлине? Тест для Android в котлинском царстве Kotlin – Operator '==' не может применяться к «Редактируемому!». и 'String' при сравнении строки Невозможно разрешить зависимости для задачи assembleAndroidTest с плагином Android Gradle 3.0.1 Почему я не могу сказать: val list = properties.map ((ключ, значение) -> "$ key = $ value") Расширение класса с множеством параметров

Оператор звездочки Kotlin до имени переменной или оператора Spread в Котлине

Я хочу знать, что именно звездочка делает до имени переменной в 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) } 

Solutions Collecting From Web of "Оператор звездочки Kotlin до имени переменной или оператора Spread в Котлине"

Оператор * известен как оператор распространения в Котлине.

Из справочника Котлин …

Когда мы вызываем 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' 

Заметки:

  • Оператор * также является оператором умножения (конечно).
  • Оператор Spread может применяться только при передаче аргументов функции. Результат операции не может быть сохранен, поскольку это чисто синтаксический сахар.
  • Оператор может сначала запутать некоторых программистов на C / C ++, потому что похоже, что указатель обнуляется. Это не так; У Котлина нет понятия указателей .
  • Оператор распространения может использоваться между другими аргументами при вызове функции vararg. Это показано в примере здесь .
  • Оператор очень похож на функцию приложения в различных языках функционального программирования.

В дополнение к ответам, которые были непосредственно направлены на «что это такое!?!», Вы часто имеете случай, когда у вас есть 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 не поддерживает это.