Функция может принимать переменное количество параметров одного типа. Для определения таких параметров применяется ключевое слово vararg. Например, нам необходимо передать в функцию несколько строк, но сколько именно строк, мы точно не знаем. Их может быть пять, шесть, семь и т.д.:
fun printStrings(vararg strings: String){ for(str in strings) println(str) } fun main() { printStrings("Tom", "Bob", "Sam") printStrings("Kotlin", "JavaScript", "Java", "C#", "C++") }
Функция printStrings принимает неопределенное количество строк. В самой функции мы можем работать с параметром как с последовательностью строк, например, перебирать элементы последовательности в цикле и производить с ними некоторые действия.
При вызове функции мы можем ей передать любое количество строк.
Другой пример - подсчет суммы неопределенного количества чисел:
fun sum(vararg numbers: Int){ var result=0 for(n in numbers) result += n println("Сумма чисел равна $result") } fun main() { sum(1, 2, 3, 4, 5) sum(1, 2, 3, 4, 5, 6, 7, 8, 9) }
Если функция принимает несколько параметров, то обычно vararg-параметр является последним.
fun printUserGroup(count:Int, vararg users: String){ println("Count: $count") for(user in users) println(user) } fun main() { printUserGroup(3, "Tom", "Bob", "Alice") }
Однако это необязательно, но если после vararg-параметра идут еще какие-нибудь параметры, то при вызове функции значения этим параметрам передаются через именованные аргументы:
fun printUserGroup(group: String, vararg users: String, count:Int){ println("Group: $group") println("Count: $count") for(user in users) println(user) } fun main() { printUserGroup("KT-091", "Tom", "Bob", "Alice", count=3) }
Здесь функция printUserGroup принимает три параметра. Значения параметрам до vararg-параметра передаются по позициям. То есть в данном случае "KT-091" будет представлять значение для параметра group. Последующие значения интерпретируются как значения для vararg-параметра вплоть до именнованных аргументов.
Оператор * (spread operator) (не стоит путать со знаком умножения) позволяет передать параметру в качестве значения элементы из массива:
fun changeNumbers(vararg numbers: Int, koef: Int){ for(number in numbers) println(number * koef) } fun main() { val nums = intArrayOf(1, 2, 3, 4) changeNumbers(*nums, koef=2) }
Обратите внимание на звездочку перед nums при вызове функции: changeNumbers(*nums, koef=2)
.
Без применения данного оператора мы столкнулись бы с ошибкой, поскольку параметры функции представляют не массив, а неопределенное количество значений типа Int.