Sobes.tech
Junior

Как да работите с колекции в Kotlin?

sobes.tech AI

Отговор от 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 става значително по-лесна благодарение на богатата стандартна библиотека и функции за разширение.