KMP Урок 5: Коллекции, преобразования, агрегации и Sequence
Если ты прошёл первые четыре урока, у тебя уже есть база: типы, условия, null safety, функции, лямбды, extensions, классы, data class, sealed class, object и companion object. То есть ты уже можешь описывать данные, состояния и поведение.
Но приложение почти никогда не работает с одним объектом. Обычно у тебя список пользователей, словарь настроек, уникальные теги без повторов, заказы по статусам, экран с секциями, фильтрация, сортировка, поиск и т.д.
И как-раз пятый урок закрывает именно это - коллекции в Kotlin и то, как с ними работать
• List, Set, Map и изменяемость. Разобрал, почему List в Kotlin - это не “вечный immutable список”. Почему MutableList можно передать как List, но это не создаёт snapshot.
Почему val фиксирует ссылку. И почему наши привычки с работой через let / var здесь напрямую не переносится.
• List, Array и IntArray. В Swift мы очень часто берём обычный Array, а в Kotlin есть List, Array и примитивные массивы вроде IntArray.
Разобрал, что выбирать по умолчанию, где Array нужен для interop / vararg, почему IntArray важен в горячих численных циклах и почему arrayOf(1, 2, 3) == arrayOf(1, 2, 3) даст false, хех.
• Set и Map. Разобрал уникальность, порядок, equals / hashCode, стабильность ключей и элементов. Почему изменяемый объект в Set может “потеряться”, почему ключи Map должны быть стабильными, чем опасны nullable значения в словаре и почему map[key] == null не всегда значит “ключа нет”.
• Преобразования коллекций. map, filter, mapNotNull, filterNotNull, filterIsInstance, flatMap, flatten, zip, chunked, windowed, distinct. Всё с привязкой к Swift: где совпадает с map / filter / compactMap, где Kotlin даёт готовый оператор, а где в Swift пришлось бы писать руками или идти в swift-algorithms.
• Агрегация, поиск и группировка. reduce vs fold, sumOf, average, maxByOrNull, maxOfOrNull, associateBy, groupBy, partition, find, any, all, none, singleOrNull.
Отдельно разобрал главный промежуточный вопрос: что происходит на пустой коллекции. Где будет 0, где null, где NaN, где исключение, а где внезапно true, как у all {}.
В конце, как обычно, домашка по нарастающей:
1. easy поработать со списками, фильтрацией и безопасным доступом
2. easy+ собрать индексы и группировки через associateBy / groupBy
3. medium обработать список заказов: фильтрация, сортировка, агрегация, группировка и Sequence там, где он реально нужен
По времени где-то на 180-200 минут. Т.к yрок большой, но и это одна из самых практичных тем: коллекции будут почти в каждом KMP файле, который ты откроешь.
Ну и само собой: вопросы, предложения, замечания - в лс или комменты всегда жду!