Sobes.tech
Junior

Jak pracovat s kolekcemi v Kotlinu?

sobes.tech AI

Odpověď od AI

V Kotlinu představují kolekce skupiny objektů. Mohou být měnitelné (mutable) nebo neměnitelné (immutable).

Neměnitelné kolekce (Immutable):

  • Obsah nem může být změněn po vytvoření.
  • Jsou bezpečné pro čtení ve více vláknech.
  • Základní typy: List, Set, Map.
val numbers: List<Int> = listOf(1, 2, 3) // Vytvoření neměnitelného seznamu
// numbers.add(4) // Chyba kompilace: neměnitelné kolekce

Měnitelné kolekce (Mutable):

  • Obsah může být změněn (přidání, odstranění, úprava prvků).
  • Výchozí není vlákno-bezpečné (je třeba synchronizace ručně).
  • Základní typy: MutableList, MutableSet, MutableMap.
val mutableNumbers: MutableList<Int> = mutableListOf(1, 2, 3) // Vytvoření měnitelného seznamu
mutableNumbers.add(4) // Přidání prvku
mutableNumbers.remove(2) // Odstranění prvku

Hlavní typy kolekcí:

  • List: Seřazená kolekce, umožňuje duplicitní prvky. Přístup přes index.
    val names: List<String> = listOf("Alice", "Bob", "Alice")
    println(names[0]) // "Alice"
    
  • Set: Neseřazená kolekce, neumožňuje duplicitní prvky. Prvky jsou uloženy unikátně.
    val uniqueNumbers: Set<Int> = setOf(1, 2, 2, 3)
    println(uniqueNumbers) // [1, 2, 3]
    
  • Map: Kolekce párů klíč-hodnota. Každý klíč je unikátní.
    val ages: Map<String, Int> = mapOf("Alice" to 30, "Bob" to 25)
    println(ages["Alice"]) // 30
    

Rozšíření pro práci s kolekcemi (funkce vyššího řádu):

Kotlin nabízí mnoho mocných rozšíření pro zpracování kolekcí:

  • filter: Vytváří novou kolekci obsahující pouze prvky splňující predikát.
    val evenNumbers = numbers.filter { it % 2 == 0 } // [2]
    
  • map: Převádí každý prvek kolekce na nový prvek, vytváří novou kolekci.
    val squaredNumbers = numbers.map { it * it } // [1, 4, 9]
    
  • forEach: Provádí akci pro každý prvek kolekce.
    numbers.forEach { println(it) } // Vypíše 1, 2, 3 řádek po řádku
    
  • reduce: Spojuje všechny prvky kolekce do jedné hodnoty pomocí operace.
    val sum = numbers.reduce { acc, i -> acc + i } // 6
    
  • fold: Podobné jako reduce, ale přijímá počáteční hodnotu.
    val sumWithInitial = numbers.fold(10) { acc, i -> acc + i } // 16 (10 + 1 + 2 + 3)
    
  • sortedBy: Seřadí kolekci podle hodnoty získané z každého prvku.
    val sortedNames = listOf("Charlie", "Alice", "Bob").sortedBy { it } // [Alice, Bob, Charlie]
    
  • groupBy: Skupinu prvků podle klíče získaného z každého prvku.
    val groupedNumbers = numbers.groupBy { if (it % 2 == 0) "even" else "odd" } // {odd=[1, 3], even=[2]}
    

Konverze mezi typy kolekcí:

Snadno lze konvertovat jeden typ kolekce na jiný, stejně tak mezi měnitelnými a neměnitelnými verzemi:

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

Práce s kolekcemi v Kotlinu je výrazně jednodušší díky bohaté standardní knihovně a funkcím rozšíření.