Как превратить список в Map через associateBy в Kotlin

Как превратить список в Map через associateBy в Kotlin
Содержание статьи

associateBy помогает построить Map по ключу, который вы извлекаете из каждого элемента коллекции. Например, список пользователей можно превратить в карту по ID. В Mentoring.digital разберём результат при повторяющихся ID и выбор между одной записью и группой.

Получаем объект по его ID

data class User(val id: Int, val name: String)

val users = listOf(
    User(7, "Ada"),
    User(9, "Lin"),
    User(7, "Sam")
)

val byId = users.associateBy { it.id }

println(byId[7]?.name) // Sam
println(byId[9]?.name) // Lin
println(byId.size)     // 2

Функция в фигурных скобках выбирает ключ для каждого пользователя. Если несколько элементов дают один ключ, в карту попадает последний из них. Поэтому в примере пользователь с ID 7 имеет имя Sam, а размер карты равен двум.

Это штатное правило преобразования, а не проверка корректности данных. Успешное получение карты не подтверждает уникальность ID в исходном списке. Если повторы недопустимы, определите способ их обнаружения и обработки отдельно.

Выбираем другое значение карты

val namesById = users.associateBy(
    keySelector = { it.id },
    valueTransform = { it.name }
)

println(namesById[7]) // Sam

Вариант с valueTransform позволяет сохранить выбранную часть элемента. В этом случае получается карта ID к имени, а не ID к объекту User. Правило о последнем значении при повторе ключа сохраняется.

Не путайте это с созданием независимых глубоких копий всех данных. При обычном варианте, где значением является объект, карта содержит соответствующие объекты исходной коллекции.

Если нужно сохранить все совпадения

val groups = users.groupBy { it.id }
println(groups[7]?.map { it.name }) // [Ada, Sam]

groupBy создаёт для каждого ключа список подходящих элементов. Он полезен, когда несколько записей с одним ID являются допустимыми версиями, событиями или наблюдениями. Выбор метода определяется смыслом данных, а не только удобством последующего обращения по ключу.

Практическая проверка

Проверьте пустой список, уникальные ID и повтор одного ID в начале и конце списка. Для каждого варианта объясните размер карты и сохранённое значение. Затем сформулируйте правило: оставить последнюю запись, сохранить все или отклонить набор с повтором.

Преобразования данных мобильного приложения можно отрабатывать на курсах Android-разработки. Выбор коллекций и обработку повторов обсудите с наставником по Kotlin.

Похожие статьи по данной теме