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

Как вывести сумму элементов в списке в Kotlin

1.0 Junior🔥 101 комментариев
#Kotlin основы#Другое#Коллекции и структуры данных

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

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

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

Подходы к суммированию элементов списка в Kotlin

В Kotlin существует несколько удобных способов вычислить сумму элементов списка. Выбор конкретного метода зависит от типа данных в списке и требований к производительности.

Базовые методы для числовых списков

Для стандартных числовых типов Kotlin предоставляет встроенные функции:

fun main() {
    // Список целых чисел
    val intList = listOf(1, 2, 3, 4, 5)
    
    // 1. Использование функции sum()
    val sum1 = intList.sum()
    println("Сумма через sum(): $sum1")
    
    // 2. Использование sumOf() для преобразования
    val sum2 = intList.sumOf { it }
    println("Сумма через sumOf(): $sum2")
    
    // Список чисел с плавающей точкой
    val doubleList = listOf(1.5, 2.5, 3.5)
    val doubleSum = doubleList.sum()
    println("Сумма дробных: $doubleSum")
}

Универсальные подходы для любых типов данных

Использование fold()

Метод fold принимает начальное значение и функцию-аккумулятор:

fun main() {
    val numbers = listOf(10, 20, 30, 40)
    
    // fold с начальным значением 0
    val sumFold = numbers.fold(0) { accumulator, element ->
        accumulator + element
    }
    println("Сумма через fold(): $sumFold")
    
    // Для строк или других типов
    val stringNumbers = listOf("10", "20", "30")
    val sumStrings = stringNumbers.fold(0) { acc, str ->
        acc + str.toInt()
    }
    println("Сумма строк через fold(): $sumStrings")
}

Использование reduce()

reduce похож на fold, но не требует начального значения (использует первый элемент):

fun main() {
    val numbers = listOf(5, 10, 15, 20)
    
    val sumReduce = numbers.reduce { acc, element ->
        acc + element
    }
    println("Сумма через reduce(): $sumReduce")
    
    // Важно: reduce выбросит исключение на пустом списке!
    val emptyList = emptyList<Int>()
    val safeSum = emptyList.fold(0) { acc, el -> acc + el }
    println("Безопасная сумма пустого списка: $safeSum")
}

Обработка сложных структур данных

Для списка объектов с числовыми полями:

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

fun main() {
    val products = listOf(
        Product("Яблоки", 100.0),
        Product("Бананы", 150.5),
        Product("Апельсины", 200.75)
    )
    
    // Суммирование по полю price
    val totalPrice = products.sumOf { it.price }
    println("Общая стоимость: $totalPrice")
    
    // Альтернатива с map и sum
    val totalPriceAlt = products.map { it.price }.sum()
    println("Альтернативный расчет: $totalPriceAlt")
}

Производительность и рекомендации

  • sum() — наиболее эффективный способ для стандартных числовых типов
  • sumOf() — предпочтителен при необходимости преобразования элементов
  • fold() — универсальное решение с контролем начального значения
  • reduce() — подходит для непустых коллекций без явного начального значения

Расширенные сценарии

fun main() {
    // Фильтрация перед суммированием
    val mixedList = listOf(1, 2, 3, 4, 5, 6)
    val evenSum = mixedList.filter { it % 2 == 0 }.sum()
    println("Сумма четных чисел: $evenSum")
    
    // Кастомная агрегация
    val customSum = mixedList.fold(0 to 0) { (posSum, negSum), element ->
        if (element > 0) (posSum + element to negSum)
        else (posSum to negSum + element)
    }
    println("Сумма положительных: ${customSum.first}, отрицательных: ${customSum.second}")
}

Заключение

Kotlin предлагает богатый набор инструментов для суммирования элементов списка. Для простых числовых списков используйте sum(), для преобразований — sumOf(), а для максимальной гибкости — fold(). Все эти методы являются inline-функциями, что обеспечивает эффективность выполнения без накладных расходов на вызов функций.