Агрегация
sum, count, fold, reduce
«Агрегация» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.
Агрегирование коллекций
Агрегирование сводит коллекцию к одному значению. Kotlin предоставляет готовые функции, такие как sum, подсчёт, average, поиск максимума, а также универсальные fold и сокращение.
sum и average
sum складывает числовые элементы, а average возвращает их среднее значение как число с плавающей точкой двойной точности.
fun main() {
val numbers = listOf(2, 4, 6, 8)
println("Sum: ${numbers.sum()}")
println("Average: ${numbers.average()}")
}Подсчёт
count возвращает количество элементов, при необходимости отфильтрованных по условию.
fun main() {
val numbers = listOf(1, 2, 3, 4, 5, 6)
println("Total: ${numbers.count()}")
println("Even count: ${numbers.count { it % 2 == 0 }}")
}maxOrNull и minOrNull
Чтобы безопасно найти крайние значения, используйте maxOrNull и minOrNull: для пустых коллекций они возвращают значение null.
fun main() {
val numbers = listOf(3, 7, 2, 9, 4)
println("Max: ${numbers.maxOrNull()}")
println("Min: ${numbers.minOrNull()}")
}sumOf и maxByOrNull
sumOf суммирует выбранное значение для каждого элемента, а maxByOrNull находит элемент с наибольшим выбранным значением.
data class Item(val name: String, val price: Int)
fun main() {
val items = listOf(Item("a", 10), Item("b", 30), Item("c", 20))
println("Total price: ${items.sumOf { it.price }}")
println("Most expensive: ${items.maxByOrNull { it.price }?.name}")
}Функция fold
fold объединяет элементы в один результат, начиная с начального значения. Лямбда-функция получает текущий накапливаемый результат и текущий элемент.
fun main() {
val numbers = listOf(1, 2, 3, 4)
val total = numbers.fold(100) { acc, n -> acc + n }
println(total)
}fold может изменять тип
Поскольку начальное значение задаёте Вы, fold может создать результат любого типа, например строку.
fun main() {
val words = listOf("Kotlin", "is", "fun")
val sentence = words.fold("") { acc, w -> if (acc.isEmpty()) w else "$acc $w" }
println(sentence)
}Функция сокращения
Операция сокращения похожа на fold, но использует первый элемент в качестве начального накапливаемого значения. Для пустой коллекции она вызывает ошибку и не может изменить тип.
fun main() {
val numbers = listOf(1, 2, 3, 4)
val product = numbers.reduce { acc, n -> acc * n }
println(product)
}fold и сокращение
Основные различия:
foldпринимает начальное значение, работает с пустыми коллекциями и может возвращать другой тип.- Сокращение начинается с первого элемента, завершается ошибкой для пустых коллекций и сохраняет тип элементов.
fun main() {
val empty = emptyList<Int>()
println(empty.fold(0) { acc, n -> acc + n })
println("fold is safe on empty lists")
}runningFold и runningReduce
Если Вам нужен каждый промежуточный результат, runningFold и runningReduce возвращают список частичных результатов.
fun main() {
val numbers = listOf(1, 2, 3, 4)
val sums = numbers.runningFold(0) { acc, n -> acc + n }
println(sums)
}Выбор агрегатора
Используйте специализированные функции — sum, подсчёт, average и maxOrNull, — когда они подходят. Для пользовательских способов объединения выбирайте fold или сокращение, отдавая предпочтение fold, если нужно начальное значение или изменение типа.
Быстрая проверка
В чём главное различие между fold и сокращением?
Итоги
Вы научились агрегировать данные с помощью sum, подсчёта, average, maxOrNull и sumOf, а также использовать универсальные fold с начальным значением, любым типом и безопасной обработкой пустых коллекций и сокращение с начальным первым элементом. Далее Вы научитесь создавать карты и упрощать вложенные коллекции.
Часто задаваемые вопросы
Урок «Агрегация» бесплатный?
Да — полный текст урока «Агрегация» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.
Чему я научусь в уроке «Агрегация»?
sum, count, fold, reduce Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Kotlin Academy?
Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Агрегация»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Kotlin Academy?
Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.