> Что делают функции all и any в Kotlin и как их использовать для проверки условий (Kotlin, Android)

Уровень: senior · Роль: mobile · Категория: Технические вопросы

Компании: Ozon

Стек: Kotlin, Android

> Пример ответа

Короткий ответ

all и any - это функции стандартной библиотеки Kotlin для проверки коллекций на соответствие предикату. all возвращает true, если все элементы удовлетворяют условию, any - если хотя бы один. Обе функции работают лениво: прекращают обход коллекции сразу после получения результата. Используются для лаконичной валидации данных, например, проверки ввода или состояния UI.

Подробное объяснение

Сигнатуры:

fun <T> Iterable<T>.all(predicate: (T) -> Boolean): Boolean
fun <T> Iterable<T>.any(predicate: (T) -> Boolean): Boolean

Ключевые особенности:

  • all возвращает true для пустой коллекции (vacuous truth), any - false.
  • Обе функции - inline, поэтому не создают лямбда-объектов в рантайме.
  • Прекращают выполнение досрочно: all - при первом false, any - при первом true.

Важно не путать с none (возвращает true, если ни один элемент не подходит) и count с предикатом.

На практике

В Android-разработке all и any часто применяются для:

  • валидации форм (проверка, что все поля заполнены);
  • проверки прав доступа перед выполнением операции;
  • фильтрации состояний UI (например, все ли загрузки завершены);
  • проверки условий перед навигацией или отправкой запроса.

Для пустых коллекций поведение может быть неочевидным - это стоит учитывать при написании бизнес-логики.

Пример кода

data class User(val name: String, val age: Int, val isActive: Boolean)

fun validateUsers(users: List<User>): Boolean {
    val allAdults = users.all { it.age >= 18 }
    val anyActive = users.any { it.isActive }
    return allAdults && anyActive
}

// Проверка формы
fun isFormValid(fields: List<String?>): Boolean =
    fields.all { !it.isNullOrBlank() }

// Проверка прав
fun canProceed(permissions: Set<String>): Boolean =
    permissions.any { it in setOf("WRITE", "ADMIN") }

// Ленивость: обход прекратится на втором элементе
val numbers = listOf(1, 2, 3, 4, 5)
val hasEven = numbers.any { it % 2 == 0 } // true, проверены 1 и 2

Как отвечать на собеседовании

Начни с определения и сигнатур. Затем объясни поведение для пустых коллекций и ленивость. Приведи реальный пример из Android-разработки. Если спросят про производительность - упомяни inline и ранний выход. Для senior-уровня добавь сравнение с none и count, а также edge cases: nullable-элементы, большие коллекции, цепочки вызовов.

Что проверяет интервьюер

  • Понимание стандартной библиотеки Kotlin, а не заучивание.
  • Умение объяснить поведение на граничных случаях (пустая коллекция).
  • Осознание ленивости и её влияния на производительность.
  • Способность применить функции к реальным задачам Android.
  • Внимание к деталям: различие all и any, их связь с none.

Типичные ошибки

  • Утверждение, что all для пустой коллекции возвращает false.
  • Путаница any с contains (хотя any { it == x } эквивалентно contains(x)).
  • Игнорирование ленивости - ожидание полного обхода.
  • Использование all там, где нужен any, и наоборот.
  • Забывание про nullable-элементы: all { it != null } работает, но any { it == null } - тоже валидно, просто менее идиоматично.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью