Назад к вопросам
Junior
126
questionbank

Как работать с коллекциями в Kotlin?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

В Kotlin коллекции представляют собой группы объектов. Они могут быть изменяемыми (mutable) или неизменяемыми (immutable).

Неизменяемые коллекции (Immutable):

  • Содержимое не может быть изменено после создания.
  • Потокобезопасны для чтения.
  • Базовые типы: List, Set, Map.
val numbers: List<Int> = listOf(1, 2, 3) // Создание неизменяемого списка
// numbers.add(4) // Ошибка компиляции: неизменяемая коллекция

Изменяемые коллекции (Mutable):

  • Содержимое может быть изменено (добавление, удаление, изменение элементов).
  • Не являются потокобезопасными по умолчанию (требуется синхронизация вручную).
  • Базовые типы: MutableList, MutableSet, MutableMap.
val mutableNumbers: MutableList<Int> = mutableListOf(1, 2, 3) // Создание изменяемого списка
mutableNumbers.add(4) // Добавление элемента
mutableNumbers.remove(2) // Удаление элемента

Основные типы коллекций:

  • List: Упорядоченная коллекция, позволяющая дубликаты. Доступ по индексу.
    val names: List<String> = listOf("Alice", "Bob", "Alice")
    println(names[0]) // "Alice"
    
  • Set: Неупорядоченная коллекция, не позволяющая дубликаты. Элементы хранятся в уникальном виде.
    val uniqueNumbers: Set<Int> = setOf(1, 2, 2, 3)
    println(uniqueNumbers) // [1, 2, 3]
    
  • Map: Коллекция пар ключ-значение. Каждый ключ уникален.
    val ages: Map<String, Int> = mapOf("Alice" to 30, "Bob" to 25)
    println(ages["Alice"]) // 30
    

Расширения для работы с коллекциями (функции высшего порядка):

Kotlin предоставляет множество мощных функций расширений для обработки коллекций:

  • filter: Создает новую коллекцию, содержащую только элементы, удовлетворяющие предикату.
    val evenNumbers = numbers.filter { it % 2 == 0 } // [2]
    
  • map: Преобразует каждый элемент коллекции в новый элемент, создавая новую коллекцию.
    val squaredNumbers = numbers.map { it * it } // [1, 4, 9]
    
  • forEach: Выполняет действие для каждого элемента коллекции.
    numbers.forEach { println(it) } // Выведет 1, 2, 3 построчно
    
  • reduce: Объединяет все элементы коллекции в одно значение, применяя операцию.
    val sum = numbers.reduce { acc, i -> acc + i } // 6
    
  • fold: Сходен с reduce, но принимает начальное значение.
    val sumWithInitial = numbers.fold(10) { acc, i -> acc + i } // 16 (10 + 1 + 2 + 3)
    
  • sortedBy: Сортирует коллекцию по значению, полученному из каждого элемента.
    val sortedNames = listOf("Charlie", "Alice", "Bob").sortedBy { it } // [Alice, Bob, Charlie]
    
  • groupBy: Группирует элементы по ключу, полученному из каждого элемента.
    val groupedNumbers = numbers.groupBy { if (it % 2 == 0) "even" else "odd" } // {odd=[1, 3], even=[2]}
    

Конвертация между типами коллекций:

Можно легко конвертировать один тип коллекции в другой, а также между изменяемыми и неизменяемыми версиями:

val mutableList: MutableList<Int> = listOf(1, 2, 3).toMutableList()
val immutableList: List<Int> = mutableListOf(4, 5, 6).toList()

Работа с коллекциями в Kotlin значительно упрощается благодаря богатству стандартной библиотеки и функциям расширений.