Generičke klase

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.

Nizovi

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)

Liste

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

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.

Map

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

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.