0Pricing
Kotlin Academy · Урок

Агрегация

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 — локальная установка не требуется.

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

  1. Фильтрация и отображение
  2. Группировка и разбиение
  3. Агрегация
  4. Создание отображений и уплощение
← Назад к Kotlin Academy