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

Что такое функция min?

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

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

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

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

Функция min() в Kotlin

min() — это функция высшего порядка (higher-order function) из стандартной библиотеки Kotlin, предназначенная для поиска минимального элемента в коллекции или последовательности данных.

Основные варианты использования

1. Для коллекций чисел

Простейший случай — поиск минимального числа:

val numbers = listOf(5, 2, 8, 1, 9)
val minNumber = numbers.min() // Результат: 1
println("Минимальное число: $minNumber")

2. Для произвольных объектов с компаратором

Когда нужно сравнивать объекты по определенному полю или критерию:

data class Product(val name: String, val price: Double)

val products = listOf(
    Product("Laptop", 999.99),
    Product("Mouse", 25.50),
    Product("Keyboard", 75.00)
)

// Находим товар с минимальной ценой
val cheapestProduct = products.minBy { it.price }
println("Самый дешевый товар: ${cheapestProduct?.name}") // Mouse

// В новых версиях Kotlin используется minByOrNull
val minProduct = products.minByOrNull { it.price }

3. Безопасные версии функции

Важно отметить, что при работе с пустыми коллекциями возникают исключения:

val emptyList = emptyList<Int>()
// val result = emptyList.min() // Выбросит NoSuchElementException

Поэтому рекомендуется использовать безопасные варианты:

val safeMin = emptyList.minOrNull() // Вернет null вместо исключения
println("Минимальное значение: ${safeMin ?: "коллекция пуста"}")

Ключевые особенности реализации

min() vs minOrNull()

  • min() — бросает исключение NoSuchElementException для пустых коллекций
  • minOrNull() — возвращает null для пустых коллекций (рекомендуется к использованию)

minBy() и minWith()

// minBy - минимум по селектору
val minByLength = listOf("apple", "kiwi", "banana").minBy { it.length }

// minWith - минимум с использованием компаратора
val minWith = listOf("apple", "kiwi", "banana").minWith(compareBy { it.length })

Внутренняя реализация

Функция min() работает за O(n) времени, где n — количество элементов. Под капотом она выполняет линейный проход:

// Упрощенная концепция реализации
fun <T : Comparable<T>> Iterable<T>.minOrNull(): T? {
    val iterator = iterator()
    if (!iterator.hasNext()) return null
    
    var min = iterator.next()
    while (iterator.hasNext()) {
        val element = iterator.next()
        if (min > element) min = element
    }
    return min
}

Практические примеры в Android разработке

Работа с данными RecyclerView

// Найти минимальную дату в списке событий
val events: List<Event> = getEventsFromDatabase()
val earliestEvent = events.minByOrNull { it.timestamp }

// Фильтрация и поиск минимума в цепочке вызовов
val minPrice = products
    .filter { it.category == "Electronics" }
    .minByOrNull { it.price }

Обработка пользовательского ввода

val userAges = listOf(25, 32, 18, 41, 22)
val minAge = userAges.minOrNull() ?: 0

// С компаратором для сложных объектов
val users = listOf(
    User("Alice", 25),
    User("Bob", 32),
    User("Charlie", 18)
)
val youngestUser = users.minByOrNull { it.age }

Важные рекомендации

  1. Всегда предпочитайте minOrNull() вместо min() для избежания неожиданных исключений
  2. Для больших коллекций учитывайте, что функция выполняет полный проход по данным
  3. Используйте asSequence() для цепочек операций над большими наборами данных:
    val minValue = largeList
        .asSequence()
        .filter { it.isValid() }
        .map { it.transform() }
        .minOrNull()
    
  4. Для пользовательских классов убедитесь, что они реализуют Comparable<T> или предоставьте компаратор

Альтернативы и похожие функции

  • minOf() — возвращает минимальное значение из результатов выполнения лямбды
  • minWith() — использует явный компаратор для сравнения
  • reduce() и fold() — более гибкие операции для кастомной агрегации
// Сравнение minOf и minBy
val strings = listOf("apple", "banana", "kiwi")
val minLength1 = strings.minOf { it.length } // Возвращает число 3
val minString = strings.minBy { it.length }   // Возвращает строку "kiwi"

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