C’t Magazine

Kotlin, alternatie­f voor Java – deel 1

- www.ct.nl/softlink/1801138

fun calc(a: Int = 3, b: Int = 2,

c: Int = 1)= a * b +c

Deze functie zou dan bijvoorbee­ld als volgt gebruikt kunnen worden:

calc() // 7 calc(b = 4) // 13 calc(c = 6, a = 5) // 16

Zoals in de laatste regel te zien is, hoef je je bij de genoemde parameters met standaardw­aarde ook niet aan de precieze volgorde van de parameters te houden.

Met Kotlin zijn ook functies van een hogere orde mogelijk. Een functie kan dus bijvoorbee­ld een andere functie als parameter meekrijgen en uitvoeren:

fun times(n: Int, f:(Int) -> Unit){ for (i in 1..n){

f(i)

}

}

De functie times krijgt bij een aanroep een lambda-expressie mee die n keer uitgevoerd wordt en zelf de actuele teller meekrijgt. Het volgende voorbeeld zet op die manier de getallen 1, 2, 3, 4 en 5 op het scherm:

times(5,{ x -> println(x)}

Als er maar één parameter is, kun je de parameterl­ijst in de lambda-expressie (× ->) ook weglaten en in plaats daarvan it gebruiken.

times(5,{ println(it) })

Maar aangezien in dit geval puur een andere functie – println – aangeroepe­n wordt, kun je ook simpelweg een functieref­erentie gebruiken:

times(5, ::println)

Om tot een syntax te komen zoals bij ingebouwde controlest­ructuren als if, mag je de lambda-expressie voor de laatste functiepar­ameter ook achter de parameterl­ijst zetten:

times(5){ x ->

println(x)

}

Zo zou je bijvoorbee­ld heel elegant een functie kunnen gebruiken om transactie­s beschikbaa­r te maken:

transactio­nal {

// instructie­s in transactie

}

Je kunt functies ook binnen andere functies definiëren om de scope van de binnenste functie zo gericht mogelijk te houden:

fun a(p: Iterable<Int>): Int { fun b(x: Int)= x * x–1 return p.map { b(x) }.sum()

}

Uitbreidin­gsfuncties

Je hebt vast wel eens gewenst dat je een klasse uit een vreemde bibliothee­k achteraf met een functie kon uitbreiden zonder daarvoor eerst een nieuwe klasse te moeten afleiden. Als dat überhaupt mogelijk is, want overerving is vaak niet toegestaan – en daar zijn goede redenen voor. In Kotlin heb je hiervoor uitbreidin­gsfuncties (extensions). Zo kun je bijvoorbee­ld voor de klasse Int een functie definiëren die een actie x keer uitvoert:

fun Int.times(action:(Int) -> Unit) {

for (i in 1..this){

action(i)

}

}

5.times {print(it)}

Het voorbeeld voert '12345' uit.

Om van een functie een uitbreidin­gsfunctie te maken, hoef je alleen het uit te breiden type (hier Int) met een punt voor de functienaa­m te zetten. Het object van het uitgebreid­e type is binnen de functie beschikbaa­r als this. In het voorbeeld is this het getal 5 waarmee de functie aangeroepe­n wordt.

Slimme typeconver­sie

Als je met if of when een type controleer­t, converteer­t Kotlin het type automatisc­h. In het volgende voorbeeld heb je direct toegang tot de eigenschap length van de klasse String omdat de compiler 'weet' dat het na een succesvoll­e controle om een string moet gaan. Daar heb je geen expliciete typeconver­sie voor nodig:

fun measure(something: Any){ if (m is String){

println(m.length)

}

}

Hetzelfde principe komt trouwens ook naar voren als je op null controleer­t. Dan wordt een 'nullable' type namelijk omgezet naar het bijbehoren­de basistype, dus bijvoorbee­ld String? naar String.

Nog veel meer

Klassen en overerving, lokale variabelen, operatoren – Kotlin biedt op nog veel meer gebieden wezenlijke vereenvoud­igingen in vergelijki­ng met Java. Meer daarover willen we uitleggen in een tweede deel van deze inleiding.

Als je niet zo lang wilt wachten en alvast eens met Kotlin wilt experiment­eren, kun je je eerste stappen zetten op try.kotlinlang.org. Deze online runtimeomg­eving biedt zelfs syntaxaanv­ulling en kan Java-code omzetten naar Kotlin. Als je profession­eel aan de slag wilt met Kotlin, is de laatste versie van IntelliJ IDEA de eerste keus. Ook de gratis Community Edition ondersteun­t Kotlin. Daarvoor heb je wel JDK (versie 6 of hoger) nodig.

(hhe)

 ??  ?? Via try.kotlinlang. org kun je Kotlin live in de browser testen – zelfs met syntaxaanv­ulling.
Via try.kotlinlang. org kun je Kotlin live in de browser testen – zelfs met syntaxaanv­ulling.

Newspapers in Dutch

Newspapers from Netherlands