Kotlin: параметры функций и циклы (vararg)

Передача параметров в функции

Рассмотрим передачу неопределенного количества параметров в Kotlin-функции. Создадим функцию printSam, изначально принимающую один параметр типа String:

fun printSam(word: String) {
    println(word)
}

printSam("sam") // Выведет "sam"

Для передачи неопределенного количества параметров перед параметром используется ключевое слово vararg:

fun printSam(vararg word: String) {
    for (item in word) {
        print(item + " ")
    }
    println()
}

printSam("sam")
printSam("sam", "hello")
printSam("hello", "sam", "new")

vararg позволяет вызывать функцию без параметров, с одним или несколькими. Если параметры отсутствуют, переменная word будет пустой. В примере word обрабатывается в цикле, что делает функцию универсальной. Вывод:

  • printSam("sam"): sam
  • printSam("sam", "hello"): sam hello
  • printSam("hello", "sam", "new"): hello sam new

Для вывода параметров в одну строку используем joinToString:

fun printSam(vararg word: String) {
    println(word.joinToString(" "))
}

Можно передавать дополнительные параметры с указанием типа:

fun printSam(item: Int, vararg word: String) {
    print("$item ")
    for (w in word) {
        print("$w ")
    }
    println()
}

printSam(1, "sam")
printSam(2, "sam", "hello")

item всегда будет первым параметром, остальные — через vararg. Вывод:

  • printSam(1,"sam"): 1 sam
  • printSam(2,"sam","hello"): 2 sam hello

Передача массива в функцию

vararg часто используется для передачи массива данных. Создадим массив:

val names = arrayOf("bog", "john", "alex")

И передадим его в функцию:

fun printSam(vararg word: Any) { // Any — для разных типов данных
    print("hi ")
    for (w in word) {
        print("$w ")
    }
    println()
}

printSam(*names)  // Используем * для распаковки массива

* распаковывает массив names. Функция корректно обрабатывает массив разных типов данных:

printSam(*arrayOf("bog", "john", "alex", 1, true)) // выведет "hi bog john alex 1 true "

Можно явно указывать параметры:

fun printSam(word: String, item: Int){
    println("$item $word")
}
printSam(item = 1, word = "sam") // выведет "1 sam"

Параметры с явным указанием можно менять местами.

Значения по умолчанию

Для параметров можно устанавливать значения по умолчанию с помощью знака равенства:

fun printSam(item: String = "hi", vararg word: String) {
    print("$item ")
    for (w in word) {
        print("$w ")
    }
    println()
}

printSam() // выведет "hi "
printSam("hello","world") // выведет "hello world "

Если параметр item не передан, используется значение по умолчанию «hi».

Циклы в Kotlin

В Kotlin доступны различные циклы:

  • forEach: Рассматривался ранее.
  • while: Выполняется, пока условие истинно:
var items = 5
while (items > 0) {
    println(items)
    items--
}
  • do while: Выполняет тело цикла один раз, затем проверяет условие:
var items = 5
do {
    println(items)
    items--
} while (items > 0)
  • for: Более гибкий, чем в Java. Можно перебирать диапазон чисел:
for (i in 0..3) {  // Диапазон от 0 до 3 включительно
    println(i)
}

for (i in 1..10 step 2) { // от 1 до 10 с шагом 2
    println(i)
}

for (i in 10 downTo 0 step 2){ //обратный цикл от 10 до 0 с шагом 2
    println(i)
}

Можно перебирать символы:

for (c in 'a'..'d') {
    println(c)
}

for (c in 'z' downTo 'a' step 5){
    println(c)
}

Использование диапазонов в условных операторах:

val x = 20
if (x in 5..30) {
    println(x)
}

Рассмотрено использование vararg для передачи неопределенного количества параметров в функции, а также различные типы циклов в Kotlin: while, do while и for с их вариациями. Kotlin предоставляет гибкие инструменты для работы с параметрами и циклами.

Что будем искать? Например,программа