Можно ли использовать extension функцию для подсчета суммы по какому-то предикату в коллекции ключ-значение в Kotlin

«Можно ли использовать extension функцию для подсчета суммы по какому-то предикату в коллекции ключ-значение в Kotlin» — вопрос из категории Kotlin, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, можно создать extension-функцию для Map или других коллекций. Пример для Map:

fun <K, V> Map<K, V>.sumByPredicate(predicate: (Map.Entry<K, V>) -> Boolean): Double {
    return this.entries
        .filter(predicate)
        .sumOf { it.value.toString().toDoubleOrNull() ?: 0.0 }
}

// Использование:
val map = mapOf("a" to "1.5", "b" to "2", "c" to "invalid")
val sum = map.sumByPredicate { it.key != "c" } // вернет 3.5

Нюансы:

  1. Обработка нечисловых значений (используем toDoubleOrNull)
  2. Возможность фильтрации по ключу/значению/всей паре
  3. Возвращаемый тип Double для работы с дробными числами