Intereting Posts
Почему в контексте нет основного атрибута цвета активности? Конфигурируемый завод в Котлине для JavaScript Связывание слушателя; Не удается найти сеттер Spring Boot сериализует текст / javascript для JSON начальная позиция блока в классе в Котлине @CreationTimestamp и @UpdateTimestamp не работают в Котлине Kotlin: Как изменить значение в паре? Как получить идентификатор документа для документа Firestore с использованием классов данных kotlin Spring Boot вставляет недопустимое datetime в MariaDB, приводит к нулевому значению, а не к нулевому полю Как назначить нулевое значение переменной типа функции в Котлин? kapt Сбой сборки с процессором Android Dagger Ссылка на вложенную собственность Котлин Вызов метода класса по умолчанию arg в конструкторе Как реализовать ленивый адаптер recyclerView для загрузки, например realm recyclerView, используя kotlin DigestUtils.md5Hex () генерирует неправильное значение хэша при передаче объекта String

Оператор звездочки 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) } 

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

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

Когда мы вызываем 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 не поддерживает это.