Функции в Kotlin
Функции позволяют группировать повторяющийся код в блоки для повышения читаемости и повторного использования. Они могут принимать аргументы, возвращать значения и быть объявлены в различных формах.
Создание функций и принципы именования
Создание функции
В Kotlin функции создаются с помощью ключевого слова fun
с последующим именем, списком параметров и телом функции.
fun sayHello() {
println("Hello, Kotlin!")
}
Принципы именования функций
- CamelCase: Имена функций должны начинаться с маленькой буквы, например,
calculateSum()
илиgetUserData()
. - Глагол + Существительное: Имена функций обычно содержат глагол, отражающий действие, например,
printMessage()
илиfetchData()
. - Информативность: Имя функции должно ясно описывать выполняемое действие.
- Краткость: Старайтесь избегать излишне длинных имен, сохраняя при этом ясность.
Аргументы в функции
Аргументы в функцию передаются по порядку либо по имени передаваемого аргумента, а тип каждого аргумента указывается после его названия через двоеточие.
fun greet(name: String, age: Int) {
println("Привет, $name! Тебе $age лет.")
}
greet("Анна", 25) // или greet(age = 25, name = "Анна")
Переменное количество параметров
Использование ключевого слова vararg
позволяет передавать в функцию любое количество аргументов.
fun sum(vararg numbers: Int): Int {
return numbers.sum()
}
println("Сумма: ${sum(1, 2, 3, 4)}") // Сумма: 10
Тип Unit
Функции, не возвращающие значения после выполнения, имеют тип Unit
(аналог void
в других языках). При этом тип можно опустить, не писав его явно.
fun printMessage(message: String): Unit {
println(message)
}
fun printAnotherMessage(message: String) {
println(message)
}
printMessage("Привет, мир!")
Однострочные функции
Однострочные функции позволяют записывать тело функции в одну строку без использования фигурных скобок, часто используется для простой логики.
fun square(x: Int) = x * x
println("Квадрат 5: ${square(5)}") // Квадрат 5: 25
Локальные функции
Локальные функции объявляются внутри другой функции и доступны только в её области видимости.
fun outerFunction() {
fun innerFunction(x: Int): Int = x + 1 // можно вызвать только в outerFunction
println("innerFunction(5): ${innerFunction(5)}")
}
outerFunction() // Выведет: innerFunction(5): 6
Функции-члены
Функции-члены (методы) объявляются внутри классов и имеют доступ к свойствам экземпляра, подробней в главе об ООП.
class Calculator {
fun add(a: Int, b: Int): Int = a + b
}
val calc = Calculator()
println("Сумма: ${calc.add(3, 4)}") // Сумма: 7
Функции обобщения
Обобщенные функции позволяют работать с данными различных типов, используя параметр типа <T>
.
fun <T> printList(list: List<T>) {
list.forEach { println(it) } // T - это тип элемента списка, в этом примере это String
}
printList(listOf("Apple", "Banana", "Cherry")) // Apple, Banana, Cherry
Лямбда функции
Лямбда функции — это выражения, которые можно сохранять в переменные и передавать как аргументы другим функциям.
val sum = { a: Int, b: Int -> a + b }
println("Сумма: ${sum(3, 4)}") // Сумма: 7
Функции высшего порядка
Функции высшего порядка принимают другие функции в качестве параметров или возвращают их.
// Принимает функцию (Int, Int) -> Int, т.е. функцию с двумя параметрами Int и возвращающую Int
fun operate(a: Int, b: Int, op: (Int, Int) -> Int): Int {
return op(a, b)
}
fun example(a: Int, b: Int) = a + b
var result = operate(10, 5) { x, y -> x - y }
println("Результат операции: $result") // Результат операции: 5
result = operate(10, 5, ::example) // Передаём ссылку на функцию example
println("Результат операции: $result") // Результат операции: 15
Анонимные функции
Анонимные функции похожи на лямбда функции, но позволяют использовать имена параметров и возвращаемое значение без лямбда-выражения.
val multiply = fun(a: Int, b: Int): Int {
return a * b
}
println("Произведение: ${multiply(4, 5)}") // Произведение: 20
Дополнительные возможности
Функции расширения
Функции расширения позволяют добавлять новые функции к существующим классам без изменения их исходного кода подробней в главе об ООП.
fun String.addExclamation() = this + "!"
println("Hello".addExclamation()) // Hello!
Рекурсивные функции
Рекурсивные функции вызывают сами себя для решения задач, разбивая проблему на более мелкие подзадачи.
fun factorial(n: Int): Int = if (n <= 1) 1 else n * factorial(n - 1)
println("Факториал 5: ${factorial(5)}") // Факториал 5: 120
При использовании функций высших порядков и лямбда функций старайтесь сохранять читаемость кода и избегайте чрезмерной вложенности.