Warsztaty i wykłady z oprogramowania

Samouczki i rozwój oprogramowania => Inne => Wątek zaczęty przez: TehekCom w Mar 19, 2026, 10:37 AM

Tytuł: Kolekcje i Struktury Danych w Kotlinie: List, Set, Map
Wiadomość wysana przez: TehekCom w Mar 19, 2026, 10:37 AM
Kolekcje w Kotlinie to jedne z najpotężniejszych narzędzi języka do efektywnego przechowywania, przetwarzania i transformacji danych. Kotlin wprowadza wyraźne rozróżnienie między kolekcjami immutable (niezmiennymi) i mutable (zmiennymi), zapewniając zarówno bezpieczeństwo, jak i elastyczność. Standardowa biblioteka w pakiecie kotlin.collections oferuje List, Set i Map, które mają krótszy i bardziej funkcjonalny interfejs API niż kolekcje Javy – szczególnie w połączeniu z lambdami i funkcjami rozszerzającymi stają się bardzo potężne. W 2026 roku te struktury są intensywnie używane w Androidzie (adaptery RecyclerView, zapytania bazy danych Room), backendzie (odpowiedzi Ktor/Spring Boot) oraz projektach Kotlin Multiplatform (wspólna logika biznesowa).

W Google wyszukiwania takie jak "Kotlin list", "Kotlin map", "Kotlin mutableListOf", "Kotlin collections" mają jeden z najwyższych wolumenów wśród tematów Kotlina w Polsce i na świecie. Dobre zrozumienie kolekcji poprawia wydajność kodu (na przykład Set z kontrolą członkostwa O(1)), zmniejsza błędy (preferując immutable dla thread-safety) i ułatwia transformacje w stylu programowania funkcjonalnego.

Dlaczego Warto Uczyć Się Kolekcji? (Perspektywa 2026)

1. List (Lista) - Kolekcja Uporządkowana
Listy to najczęściej używane struktury. Są uporządkowane, pozwalają na duplikaty elementów, dostęp po indeksie.

// Immutable List (zalecana - bezpieczna)
val owoce = listOf("jabłko", "gruszka", "wiśnia", "jabłko") // duplikaty dozwolone
println(owoce[1]) // gruszka
println(owoce.size) // 4
println(owoce.indexOf("wiśnia")) // 2
println(owoce.contains("banan")) // false

// Mutable List
val mutableOwoce = mutableListOf("banan", "winogrono")
mutableOwoce.add("pomarańcza") // dodaj na końcu
mutableOwoce.add(1, "kiwi") // dodaj na indeksie
mutableOwoce.remove("banan") // usuń wartość
mutableOwoce[0] = "ananas" // zmień
println(mutableOwoce) // [ananas, kiwi, winogrono, pomarańcza]

// Slicing i subList
println(owoce.subList(1, 3)) // [gruszka, wiśnia]

// Powszechne transformacje (styl funkcjonalny)
val duzeLitery = owoce.map { it.uppercase() } // wszystkie wielkimi literami
val dlugieZnaki = owoce.filter { it.length > 5 } // filtruj
val posortowane = owoce.sorted() // alfabetycznie
val sumaDlugosci = owoce.fold(0) { acc, owoc -> acc + owoc.length } // suma długości
println(duzeLitery) // [JABŁKO, GRUSZKA, WIŚNIA, JABŁKO]

Optymalizacja ArrayList: mutableListOf() używa w tle ArrayList – szybkie dla dużych danych.

2. Set (Zbiór) - Kolekcja Bez Duplikatów
Sety są nieuporządkowane, nie pozwalają na duplikaty elementów, kontrola członkostwa jest bardzo szybka (oparta na HashSet).

// Immutable Set
val unikalne = setOf(1, 2, 2, 3, 4) // 2 duplikat, zostaje jeden
println(unikalne) // [1, 2, 3, 4]

// Mutable Set
val mutableSet = mutableSetOf("czerwony", "zielony")
mutableSet.add("niebieski")
mutableSet.add("zielony") // nie doda
mutableSet.remove("czerwony")

// Operacje na zbiorach
val set1 = setOf(1, 2, 3)
val set2 = setOf(3, 4, 5)
println(set1 union set2) // [1, 2, 3, 4, 5]
println(set1 intersect set2) // [3]
println(set1 - set2) // [1, 2] (różnica)

// Członkostwo (bardzo szybkie)
println(3 in set1) // true

Dla LinkedHashSet i SortedSet: linkedSetOf(), sortedSetOf().

3. Map (Słownik) - Pary Klucz-Wartość
Mapy przechowują pary klucz-wartość, klucze są unikalne.

// Immutable Map
val osoba = mapOf("imie" to "Mehmet", "wiek" to 35, "miasto" to "Ankara")
println(osoba["imie"]) // Mehmet
println(osoba.keys) // [imie, wiek, miasto]
println(osoba.values) // [Mehmet, 35, Ankara]
println(osoba.entries) // pary klucz-wartość

// Mutable Map
val mutableMap = mutableMapOf("pensja" to 5000)
mutableMap["departament"] = "IT" // dodaj/aktualizuj
mutableMap += "bonus" to 1000 // operator +
mutableMap -= "pensja" // usuń

// Bezpieczny dostęp
println(osoba.getOrDefault("email", "Brak")) // Brak

// Transformacje
val imionaDuze = osoba.mapKeys { it.key.uppercase() }
val wiekZwiekszony = osoba.mapValues { if (it.key == "wiek") it.value + 1 else it.value }

// Zagnieżdżona Map
val firma = mutableMapOf(
    "pracownik1" to mapOf("imie" to "Ayşe", "pensja" to 6000),
    "pracownik2" to mapOf("imie" to "Ali", "pensja" to 7000)
)
println(firma["pracownik1"]?.get("pensja")) // 6000

Dla LinkedHashMap i SortedMap: linkedMapOf(), sortedMapOf().

Porównanie cech:

Zaawansowane Zastosowania i Wskazówki
Sequence (Leniwa Ewaluacja): Przyjazna dla pamięci w dużych danych.

val lazySeq = generateSequence(1) { it + 1 }.take(1000000).filter { it % 2 == 0 }
println(lazySeq.sum()) // Oblicza tylko gdy potrzebne

Destructuring: Dla entries Map.

for ((klucz, wartosc) in osoba) {
    println("$klucz: $wartosc")
}

Specjalne dla Android/Compose: mutableStateListOf(), snapshotFlow dla reaktywnego UI.
Multiplatform: Expect/actual dla specyficznych dla platformy kolekcji (np. Array w JS).

Wniosek i Praktyczne Sugestie
Kolekcje ujawniają funkcjonalną moc Kotlina – preferuj immutable, mutable tylko gdy konieczne. Zły wybór traci wydajność, dobry czyni profesjonalnym.

Praktyka:

Ten przewodnik pozwoli ci w pełni opanować kolekcje. W rzeczywistych projektach (przetwarzanie odpowiedzi API, zapytania bazy danych) te struktury dadzą ci dużą przewagę. Dla przykładowego projektu lub konkretnej kolekcji zostaw komentarz! Powodzenia w aplikacjach Kotlina w 2026.
Tytuł: Odp: Kolekcje i Struktury Danych w Kotlinie: List, Set, Map
Wiadomość wysana przez: PerdeninArdindakiler w Kwi 08, 2026, 01:18 PM
Łatwo było mi to zrozumieć. Podziękowanie.