Kao i u Javi i u C++, u Kotlinu je moguće definisati generičke klase. O generičkom programiranju se može pročitati recimo ovde, a mi ćemo u ovom delu izložiti najvažnije generičke klase u Kotlinu. Detaljnije o generičkim klasama se može naći u zvaničnoj dokumentaciji ovde
U Kotlinu su verovatno najznačajnije generičke klase kolekcije. U te klase spadaju implementacije listi, nizova, mapa (rečnika), skupova i raznih drugih struktura podataka. Za svaku od ovih kolekcija postoje dve verzije - mutabilna i imutabilna. Mutabilne kolekcije mogu da se menjaju, dok imutabilne su otvorene samo za čitanje.
U Kotlinu postoji više načina da se definiše niz. Najlakši način je da se pozove konstruktor koji prima dva argumenta - veličinu niza i funkciju koja poziciji dodeljuje vrednost. Recimo, na ovaj način se definiše niz koji se popunjava nulama:
val nule = Array(15, {i -> 0})
Sledeći kod će definisati niz brojeva od 1 do 100:
val brojevi = Array(100, {i -> i+1})
Naravno, niz ne mora biti niz celih brojeva. Sve što je potrebno uraditi je staviti drugačiju vrednost na desnu stranu strelice. Ako nije odmah jasno o kojem je tipu reč, onda se deklariše na ovaj način Array<TipPodatka>(br_elemenata, ...). Osim ovog načina kreiranja nizova, može se pozvati metod intArrayOf i kao argumente mu proslediti elemente niza. Elemente u nizu je moguće dobiti na dva načina - metodom get ili indeksnim pristupom, kao u kodu ispod:
val niz = Array(100, {i -> i+1}) println(niz.get(5)) println(niz[5])
Takođe, elementi niza mogu i da se izmene pomoću metoda set, kojem se kao prvi argument prosleđuje indeks elementa nad kojem vršimo promenu, a kao drugi argument vrednost koja treba tu da se upiše. Recimo, možemo na petanestom elementu da upišemo -1.
val niz = Array(100, {i -> i+1}) niz.set(14, -1)
Lista se u Kotlinu može zadati kao mutabilna ili imutabilna. Imutabilne su objekti klase List, a imutabilne su objekti klase MutableList. Lista se može napraviti metodom listOf ili mutableListOf čiji su argumenti elementi liste.
val lista = listOf(1, 2, 3, 4, 5)
U List se elementi ne mogu dodavati, niti se mogu iz nje brisati elementi. U mutabilne liste se mogu dodavati elementi i to funkcioniše na sledeći način:
val lista = mutableListOf(1, 2, 3, 4, 5) // dodaje 10 na kraj liste lista.add(10) // dodaje 12 na indeks 2 lista.add(2, 12) // dodaje elemente 1, 2, 7, 8 na kraj liste lista.addAll(listOf(1, 2, 7, 8))
Spisak metoda za mutabilne i imutabilne liste se može naći na odgovarajućim stranicama u zvaničnoj dokumentaciji.
Skupovi se definišu na sličan način kao nizovi i liste, samo što se poziva metod setOf koji kreira skup. Kao i kod listi, postoje mutabilni i imutabilni skupovi. Za mutabilni skup se koristi metod mutableSetOf. U skupu može postojati najviše jedan element sa nekom vrednošću. Recimo, sledeći skup će imati redom elemente 1, 2, 3:
val skup = setOf(1, 2, 3, 3, 2, 2, 2)
Kao i kod mutabilnih listi, i kod mutabilnih skupova se dodaju elementi metodom add ili addAll na isti način kao i kod listi, osim što add ne može da primi indeks kao argument, jer indeks nema mnogo smisla kad su u pitanju skupovi.
Imutabilne mape se u Kotlinu metodom mapOf, dok se mutabilne dodaju metodom mutableMapOf. Na primeru to izgleda ovako:
val mapa = mapOf("kljuc1" to 2, "kljuc2" to 7)
Spisak svih ključeva mape možemo dobiti u preko atributa keys, dok spisak svih vrednosti se nalazi u values.
val mapa = mapOf("kljuc1" to 2, "kljuc2" to 7) println("Svi kljucevi su: ${mapa.keys}") println("Sve vrednosti su: ${mapa.values}")
Pristup elementima mape ostvare se indeksno, navođenjem ključa u uglastim zagrada. Dodavanje elementa u mutabilnu mapu se rešava metodom put, kao u primerima ispod:
val mapa = mutableMapOf("kljuc1" to 2, "kljuc2" to 7) println("mapa["kljuc1"]") // postavlja u kljuc "treci" broj 12 mapa.put("treci", 12)
Obilazak elemenata u kolekciji može se postići u for petlji na sledeći način:
for (element in kolekcija) { naredbe... }
Prethodni kod radi za sve, osim za mape. Naime, za mape mora drugačiji pristup zbog postojanja ključeva i vrednosti. Za mape je tada potrebno uraditi:
for ((kljuc, vrednost) in kolekcija) { naredbe... }
U svakom koraku petlje se u kljuc stavlja ključ sledećeg elementa, a u vrednost njegova vrednost.