0Pricing
Android Academy · Урок

Функции-расширения и функции высшего порядка

Добавляйте поведение существующим типам с помощью функций-расширений и используйте функции высшего порядка и функции области видимости (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 — локальная установка не требуется.

Все уроки этого курса

  1. Безопасность работы с null
  2. Классы и объекты
  3. Классы данных и запечатанные классы
  4. Функции-расширения и функции высшего порядка
← Назад к Android Academy