← Назад к вопросам

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

1.0 Junior🔥 111 комментариев
#Kotlin основы

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое функция высшего порядка в контексте Android/Kotlin?

Функция высшего порядка (higher-order function) — это функция, которая принимает другие функции в качестве параметров и/или возвращает функцию как результат. Этот концепт, пришедший из функционального программирования, является фундаментальным для Kotlin и широко используется в Android-разработке для создания гибкого, выразительного и повторно используемого кода. Ключевая идея — обработка функций как объектов первого класса (first-class citizens), что позволяет передавать их, сохранять в переменных и оперировать ими как любыми другими данными.

Практический пример: фильтрация списка с пользовательской логикой

Представим, что в Android-приложении нам нужно отфильтровать список пользователей по разным критериям: по возрасту, по активности, по премиум-статусу. Вместо создания отдельных функций для каждого случая, мы можем создать одну функцию высшего порядка, которая принимает лямбда-выражение (или функцию-предикат) с условием фильтрации.

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

// Определяем data class для представления пользователя
data class User(
    val id: Int,
    val name: String,
    val age: Int,
    val isActive: Boolean,
    val isPremium: Boolean
)

// Функция высшего порядка: принимает список пользователей и функцию-предикат
// Предикат — это функция, принимающая User и возвращающая Boolean
fun filterUsers(users: List<User>, predicate: (User) -> Boolean): List<User> {
    val result = mutableListOf<User>()
    for (user in users) {
        // Вызываем переданную функцию для проверки условия
        if (predicate(user)) {
            result.add(user)
        }
    }
    return result
}

Использование с различными лямбда-выражениями

// Пример списка пользователей
val users = listOf(
    User(1, "Анна", 25, isActive = true, isPremium = false),
    User(2, "Иван", 30, isActive = true, isPremium = true),
    User(3, "Мария", 17, isActive = false, isPremium = false),
    User(4, "Петр", 45, isActive = true, isPremium = false)
)

// 1. Фильтрация активных пользователей
val activeUsers = filterUsers(users) { user ->
    user.isActive
}

// 2. Фильтрация премиум-пользователей старше 18 лет
val adultPremiumUsers = filterUsers(users) { user ->
    user.isPremium && user.age >= 18
}

// 3. Фильтрация по сложному условию (используем явное объявление)
val customFilter: (User) -> Boolean = { user ->
    user.age in 20..40 && !user.isPremium
}
val filteredCustom = filterUsers(users, customFilter)

Встроенные функции высшего порядка в Kotlin/Android

На практике в Kotlin уже есть множество готовых функций высшего порядка для коллекций, которые мы ежедневно используем в Android-разработке:

// Стандартные функции высшего порядка из Kotlin Stdlib
val names = users
    .filter { it.isActive }           // filter — функция высшего порядка
    .map { it.name.uppercase() }      // map — тоже функция высшего порядка
    .sortedBy { it.length }           // sortedBy — и это функция высшего порядка

// Пример с onClickListener в Android (классический случай)
button.setOnClickListener { view ->
    // Лямбда, переданная в setOnClickListener — это функция
    showToast("Кнопка нажата!")
}

// Использование в асинхронных операциях
lifecycleScope.launch {
    val result = withContext(Dispatchers.IO) {
        // Блок кода, передаваемый как лямбда
        performNetworkRequest()
    }
    updateUi(result)
}

Ключевые преимущества использования функций высшего порядка

  • Уменьшение дублирования кода (DRY — Don't Repeat Yourself): Логика обхода коллекции инкапсулирована в одной функции, а изменяемая часть (условие фильтрации) передается извне.
  • Повышение абстракции: Позволяют оперировать не только данными, но и операциями над ними.
  • Улучшение читаемости: Код становится более декларативным и выразительным, особенно с использованием лямбда-выражений.
  • Гибкость и расширяемость: Новые критерии фильтрации добавляются без изменения существующего кода фильтрации.
  • Поддержка функциональных паттернов: Возможность композиции функций, каррирования и других приемов ФП.

Заключение

В Android-разработке на Kotlin функции высшего порядка — это не просто академическое понятие, а ежедневный инструмент. Они лежат в основе стандартной библиотеки Kotlin (filter, map, let, run, apply), обработки событий UI, работы с асинхронным кодом (корутины, RxJava) и архитектурных подходов (реактивное программирование). Понимание и грамотное использование функций высшего порядка существенно повышает качество кода, делая его более модульным, тестируемым и адаптивным к изменениям требований.