Как объединить коллекцию элементов c одинаковым id?

Есть коллекция объектов:

data class VideoStatistic(val id: String, val viewingTime: Long)

В эту коллекцию может попасть несколько видео с одинаковыми id, но разным временем просмотра. Например, VideoStatistic(1, 2) и VideoStatistic(1, 3).

Как мне объединить такие элементы, чтобы в результате получить коллекцию, в которой будет лежать VideoStatistic(1, 5)?


Ответы (1 шт):

Автор решения: Vadik

Предположим, у вас есть коллекция объектов:

val statistics: Collection<VideoStatistic> =
    listOf(
        VideoStatistic("1", 2),
        VideoStatistic("1", 3),
        VideoStatistic("2", 2),
    )

С помощью стандартной функции groupBy это можно сделать следующим образом:

val mergedStatistics: Collection<VideoStatistic> =
    statistics.groupBy(VideoStatistic::id, VideoStatistic::viewingTime)
        .mapValues { (id, viewingTimes) ->
            VideoStatistic(id, viewingTimes.sum())
        }
        .values

На выходе получаем:

[VideoStatistic(1, 5), VideoStatistic(2, 2)] 
→ Ссылка