Функции-расширения и функции высшего порядка
Добавляйте поведение существующим типам с помощью функций-расширений и используйте функции высшего порядка и функции области видимости (let, apply, also, run, with) для выразительного кода Kotlin.
«Функции-расширения и функции высшего порядка» — бесплатный урок Android Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Android Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Android Academy содержит 4 уроков всего.
Функции-расширения
Функция-расширение позволяет добавлять новые функции в существующие классы без их изменения и без использования наследования. Вы можете расширять String, Int, собственные классы и даже View из Android.
Синтаксис: fun TypeName.functionName() { }
Написание функций-расширений
Внутри функции-расширения this обозначает объект-получатель:
fun String.isPalindrome(): Boolean {
val cleaned = this.lowercase().filter { it.isLetter() }
return cleaned == cleaned.reversed()
}
fun Int.isEven() = this % 2 == 0
fun main() {
println("racecar".isPalindrome()) // true
println("hello".isPalindrome()) // false
println(4.isEven()) // true
println(7.isEven()) // false
}Функции-расширения для представлений Android
Распространённый подход в Android — скрывать и показывать представления с помощью расширения, вместо того чтобы повторять шаблонный код:
import android.view.View
fun View.show() { visibility = View.VISIBLE }
fun View.hide() { visibility = View.GONE }
fun View.invisible() { visibility = View.INVISIBLE }
// Usage in Activity:
// binding.progressBar.show()
// binding.recyclerView.hide()Функции высшего порядка
Функция высшего порядка принимает функцию в качестве параметра или возвращает функцию. Вы уже использовали такие функции: filter, map и forEach — это функции высшего порядка.
Синтаксис типа функции: (ParamType) -> ReturnType
Передача функций в качестве параметров
Определите функцию, которая принимает другую функцию:
fun operate(a: Int, b: Int, op: (Int, Int) -> Int): Int {
return op(a, b)
}
fun main() {
val sum = operate(3, 4) { x, y -> x + y }
val prod = operate(3, 4) { x, y -> x * y }
val max = operate(3, 4, ::maxOf) // method reference
println(sum) // 7
println(prod) // 12
println(max) // 4
}Возврат функций
Функции также могут возвращать другие функции — это удобно для создания настраиваемого поведения:
fun makeMultiplier(factor: Int): (Int) -> Int {
return { number -> number * factor }
}
fun main() {
val double = makeMultiplier(2)
val triple = makeMultiplier(3)
println(double(5)) // 10
println(triple(5)) // 15
val numbers = listOf(1, 2, 3, 4)
println(numbers.map(double)) // [2, 4, 6, 8]
}Функции области видимости: let
Функции области видимости Kotlin выполняют блок для объекта и возвращают результат. let используется для проверки на null и преобразований:
fun main() {
val name: String? = "Alice"
// Only runs if name is not null
name?.let {
println("Name length: ${it.length}")
println("Upper: ${it.uppercase()}")
}
// Transform a value
val length = name?.let { it.length } ?: 0
println("Length: $length") // 5
}Функции области видимости: apply и also
apply настраивает объект и возвращает объект. also выполняет побочный эффект и возвращает объект:
data class Config(var host: String = "", var port: Int = 0, var timeout: Int = 0)
fun main() {
// apply: configure an object (this = receiver)
val config = Config().apply {
host = "api.example.com"
port = 443
timeout = 30
}
println(config) // Config(host=api.example.com, port=443, timeout=30)
// also: log or debug (it = receiver)
val result = listOf(1, 2, 3)
.also { println("Original: $it") }
.map { it * 2 }
.also { println("Doubled: $it") }
}Функции области видимости: run и with
run выполняет блок для объекта и возвращает результат блока. with работает похожим образом, но не является расширением:
data class User(val name: String, val age: Int)
fun main() {
val user = User("Bob", 30)
// run: compute something using the object
val greeting = user.run {
if (age >= 18) "Hello, $name!" else "Hi, $name!"
}
println(greeting) // Hello, Bob!
// with: group operations on an object
val info = with(user) {
"Name: $name, Age: $age"
}
println(info) // Name: Bob, Age: 30
}Шпаргалка по функциям области видимости
Краткая памятка по выбору подходящей функции области видимости:
let— безопасный для null блок, преобразование объекта, возвращает результат лямбда-функцииapply— настройка объекта, возвращает объект (this)also— побочные эффекты (журналирование), возвращает объект (it)run— вычисление результата на основе объекта, возвращает результат лямбда-функцииwith— группировка вызовов для объекта, не является расширением
Встроенные функции и reified
Пометьте функцию высшего порядка как inline, чтобы избежать создания объекта лямбды во время выполнения. reified позволяет использовать обобщённый тип T во время выполнения (обычно он стирается):
inline fun <reified T> Any.isOfType(): Boolean = this is T
fun main() {
println("hello".isOfType<String>()) // true
println(42.isOfType<String>()) // false
println(3.14.isOfType<Double>()) // true
}Быстрая проверка
Какая функция области видимости лучше всего подходит для настройки только что созданного объекта и возврата этого же объекта?
Итоги: расширения и функции высшего порядка
Теперь Вам доступен функциональный инструментарий Kotlin:
- Функции-расширения — добавляют поведение любому типу без наследования
- Функции высшего порядка — принимают и возвращают функции, обеспечивая гибкие API
- Функции области видимости:
let(проверка на null),apply(настройка),also(побочный эффект),run/with(вычисление) inline+reified— лямбды без дополнительных затрат и информация о типе во время выполнения
Далее: создание многoэкранных приложений с помощью фрагментов.
Часто задаваемые вопросы
Урок «Функции-расширения и функции высшего порядка» бесплатный?
Да — полный текст урока «Функции-расширения и функции высшего порядка» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Android Academy, подпишись на CoddyKit PRO. Курс Android Academy содержит 4 уроков всего.
Чему я научусь в уроке «Функции-расширения и функции высшего порядка»?
Добавляйте поведение существующим типам с помощью функций-расширений и используйте функции высшего порядка и функции области видимости (let, apply, also, run, with) для выразительного кода Kotlin. Ты практикуешь Android Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Android Academy?
Предыдущий опыт не требуется. Android Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Функции-расширения и функции высшего порядка»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Android Academy?
Да. Каждый урок Android Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Безопасность работы с null
- Классы и объекты
- Классы данных и запечатанные классы
- Функции-расширения и функции высшего порядка