


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