07/11/2000
Mange udviklere, der kommer fra sprog som Java, C# eller JavaScript, er vant til at bruge den ternære operator (betingelse ? værdi_hvis_sand: værdi_hvis_falsk) for at skrive korte, betingede tildelinger. Det kan derfor komme som en overraskelse, at Kotlin bevidst har undladt denne operator. Men frygt ej! Kotlin tilbyder i stedet mere kraftfulde og læsbare alternativer, der er dybt integreret i sprogets design. Denne artikel vil guide dig igennem de forskellige måder, hvorpå du kan opnå den samme funktionalitet som den ternære operator, og hvorfor Kotlins tilgang ofte er at foretrække.

Hvorfor findes den ternære operator ikke i Kotlin?
Den primære årsag til, at Kotlin ikke har en ternær operator, er, at kontrolstrukturer som if, when og try-catch er udtryk (expressions) og ikke kun udsagn (statements). Forskellen er fundamental:
- Et udsagn (statement) udfører en handling, men returnerer ikke en værdi. Et traditionelt
if-udsagn i Java er et eksempel på dette. - Et udtryk (expression) evalueres til en værdi og kan derfor tildeles til en variabel, returneres fra en funktion eller bruges som en del af et større udtryk.
Da if i Kotlin er et udtryk, kan det direkte returnere en værdi. Dette gør en separat ternær operator overflødig. Kotlins designere prioriterede læsbarhed og mente, at if (a) b else c er mere eksplicit og lettere at forstå for alle udviklere end den mere kryptiske a ? b: c syntaks.
Det primære alternativ: if-else som et udtryk
Den mest direkte erstatning for den ternære operator i Kotlin er at bruge en if-else-blok som et udtryk. Syntaksen er enkel og letlæselig.
Lad os se på et klassisk eksempel, hvor vi finder det mindste af to tal. I Java kunne man bruge den ternære operator:
// Java eksempel int num1 = 82731, num2 = 32854; int small = num1 > num2 ? num2: num1; System.out.println(small);I Kotlin opnår vi præcis det samme med et if-else-udtryk på en enkelt linje:
// Kotlin eksempel fun main() { val num1 = 82731 val num2 = 32854 val small = if (num1 > num2) num2 else num1 println(small) }Her evalueres if (num1 > num2). Hvis betingelsen er sand, returnerer udtrykket værdien num2. Hvis den er falsk, returnerer det værdien fra else-grenen, altså num1. Resultatet tildeles direkte til variablen small. Det er lige så kortfattet som den ternære operator, men bruger en velkendt og letforståelig syntaks.

Håndtering af flere betingelser: if-else-if og 'when'
Når logikken bliver mere kompleks end en simpel sand/falsk-betingelse, skinner Kotlins udtryksbaserede tilgang virkelig igennem. Her har vi to fremragende værktøjer: if-else-if-stigen og det endnu mere kraftfulde when-udtryk.
Brug af if-else-if-stigen
Du kan kæde flere if-else-betingelser sammen for at håndtere flere mulige udfald. Husk, at den sidste else er obligatorisk, når du bruger det som et udtryk, da udtrykket altid skal garantere en værdi.
Forestil dig et simpelt program, der giver en besked baseret på brugerens menuvalg:
fun main() { println("Vælg din bestilling") println("a: Pizza\nb: Pommes Frites\nc: Burger") val svar = readLine() val besked = if (svar == "a") { "Lækkert! Din pizza bliver leveret snarest." } else if (svar == "b") { "Godt valg! Dine pommes frites er hos dig om 30 minutter." } else if (svar == "c") { "Din burger er næsten klar, velbekomme!" } else { "Ugyldig bestilling." } println(besked) }Dette er funktionelt, men kan blive lidt rodet med mange betingelser. Her kommer when ind i billedet.
Det elegante alternativ: 'when'-udtrykket
when i Kotlin er en slags forbedret `switch`-statement, men det kan også bruges som et udtryk, hvilket gør det til et fantastisk alternativ til komplekse if-else-if-kæder. Det er ofte mere læsbart og struktureret.

Lad os omskrive menu-eksemplet med when:
// Samme menu-eksempel med 'when' val besked = when (svar) { "a" -> "Lækkert! Din pizza bliver leveret snarest." "b" -> "Godt valg! Dine pommes frites er hos dig om 30 minutter." "c" -> "Din burger er næsten klar, velbekomme!" else -> "Ugyldig bestilling." } println(besked)Som du kan se, er koden renere og mere overskuelig. when kan også håndtere mere komplekse betingelser, såsom at tjekke for værdier inden for et interval (range):
fun main() { print("Indtast procent: ") val procent = readLine()?.toIntOrNull() ?: 0 val karakter = when (procent) { in 90..100 -> 'A' in 80..89 -> 'B' in 70..79 -> 'C' in 60..69 -> 'D' else -> 'E' } println("Karakter: $karakter") }Specialtilfældet: Null-checks med Elvis-operatoren (?:)
Et meget almindeligt scenarie, hvor den ternære operator ofte bruges, er til at tjekke for null og tildele en standardværdi. Kotlin, med sit fokus på null-sikkerhed, har en dedikeret og elegant operator til netop dette formål: Elvis-operatoren (?:).
Navnet kommer af, at operatoren, hvis man vender hovedet på sned, ligner en smiley med Elvis Presleys karakteristiske frisure.
Syntaksen er: val resultat = muligvisNullVærdi ?: standardVærdi
Operatoren fungerer således: Hvis udtrykket på venstre side ikke er null, returneres dets værdi. Hvis det *er* null, returneres værdien på højre side.
Lad os se et eksempel, hvor vi vil sammensætte et fuldt navn, men hvor efternavnet kan være null.

fun main() { val fornavn: String? = "Katie" val efternavn: String? = null // Uden Elvis-operatoren ville det se sådan ud: // val fuldeNavnGammel = fornavn + " " + (if (efternavn != null) efternavn else "") // Med Elvis-operatoren: val fuldeNavn = fornavn + " " + (efternavn ?: "") println(fuldeNavn) // Output: Katie }Elvis-operatoren gør koden ekstremt kompakt og letlæselig for null-håndtering, hvilket er en meget hyppig opgave i softwareudvikling.
Sammenligningstabel
For at give et hurtigt overblik, er her en tabel, der sammenligner den traditionelle ternære operator med Kotlins alternativer.
| Scenarie | Java (Ternær Operator) | Kotlin (Alternativ) | Kommentar |
|---|---|---|---|
| Simpel betingelse | val x = a > b ? a: b; | val x = if (a > b) a else b | Lige så kortfattet, men bruger standard if-else syntaks. |
| Flere betingelser | Indlejret ternær (ofte ulæseligt) | val x = when { ... } | when er markant mere læsbart og skalerbart. |
| Null-check | val x = y != null ? y: "default"; | val x = y ?: "default" | Elvis-operatoren er specialiseret og ekstremt koncis. |
Ofte Stillede Spørgsmål (OSS)
- Spørgsmål: Kommer jeg til at savne den ternære operator i Kotlin?
- Svar: I starten vil du måske instinktivt forsøge at skrive
? :, men du vil hurtigt vænne dig til at brugeif-elsesom et udtryk. De fleste udviklere finder Kotlins måde mere læsbar og fleksibel i længden, især når logikken bliver mere kompleks. - Spørgsmål: Kan jeg bruge
whentil en simpel sand/falsk-betingelse? - Svar: Ja, det kan du godt. Du kan skrive
when (betingelse) { true -> værdi1; false -> værdi2 }. Dog er et simpeltif-else-udtryk generelt anset for at være mere idiomatisk og en smule kortere for dette specifikke tilfælde. - Spørgsmål: Hvad er den største fordel ved at bruge udtryk i stedet for udsagn?
- Svar: Det fører til mere koncis og funktionel kode. Da et udtryk altid returnerer en værdi, kan du tildele resultatet direkte til en
val(en uforanderlig variabel), hvilket reducerer behovet for midlertidige, foranderlige variabler (var). Dette kan gøre din kode mere sikker og lettere at ræsonnere om.
Konklusion
Selvom Kotlin ikke har en ternær operator, er det ikke en mangel, men et bevidst designvalg. Ved at gøre kontrolstrukturer som if og when til kraftfulde udtryk, giver sproget udviklere værktøjer, der er mere fleksible, skalerbare og frem for alt mere læsbare. Fra det simple if-else-udtryk, der direkte erstatter den ternære operator, til det elegante when-udtryk for kompleks logik, og den specialiserede Elvis-operator for null-håndtering, har du alt, hvad du behøver for at skrive ren, udtryksfuld og effektiv betinget kode i Kotlin.
Hvis du vil læse andre artikler, der ligner Kotlin: Alternativer til den Ternære Operator, kan du besøge kategorien Sundhed.
