Intereting Posts
Невозможно преобразовать в коллекцию в котлин Программно изменять ориентацию меню кланов Как объявить переменную типа перечисления в Kotlin? Не удается запустить проект kotlin на Android Studio 3.0 Делегация частичного класса в Котлине Почему диапазон повторного использования Dagger медленнее, чем Singleton? SonarQube: как применить несколько профилей качества к одному проекту? Не удается сохранить модель данных, содержащую Список <Модель> с комнатой ORM Kotlin Класс Android с контекстом в поле объекта в Котлине Kotlin не может получить доступ к kotlin.jvm.functions.Function1 при вызове функции kotlin с java lambda Котлин не смог преобразовать класс действия градиента в лямбда Как назначить значение параметру KMutableProperty? Весенняя загрузка с одностраничным приложением на AWS Elastic Beanstalk требует дополнительной перенаправления Как создать общий массив, заполненный нулями в Котлине? Как использовать класс Kotlin в классе java?

Оператор звездочки 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 не поддерживает это.