Bereiken (Range) en progressies (Progression) zijn ingebouwde mechanismen in Kotlin voor het voorstellen van reeksen waarden met een bepaalde stap. Ze worden vaak gebruikt bij het werken met lussen, voorwaarden, het doorlopen van collecties en het valideren van gegevens. Range is ontstaan als een manier om de syntaxis van Kotlin beknopter en expressiever te maken in vergelijking met Java.
In Java werden soortgelijke taken opgelost met for- en while-lussen met indexen — omslachtig en foutgevoelig. In Kotlin zijn er compacte operators voor het maken van bereiken (bijvoorbeeld, 1..10) en methoden voor het instellen van stappen.
Kotlin biedt standaard numerieke bereiken (IntRange, LongRange, CharRange, UIntRange, etc.) en interfaces voor het creëren van eigen progressies:
Voorbeeld code:
for (i in 1..5) print("$i ") // 1 2 3 4 5 for (i in 5 downTo 1 step 2) print("$i ") // 5 3 1 // Waardecontrole val x = 42 if (x in 1..100) println("In het bereik!")
Je kunt een bereik voor jouw types definiëren door de operators rangeTo en Progression te implementeren:
data class Version(val major: Int, val minor: Int) : Comparable<Version> { override fun compareTo(other: Version) = compareValuesBy(this, other, Version::major, Version::minor) } operator fun Version.rangeTo(other: Version) = VersionRange(this, other) class VersionRange( override val start: Version, override val endInclusive: Version ) : ClosedRange<Version> for (v in Version(1, 0)..Version(1, 2)) println(v)
Belangrijke kenmerken:
start..end, downTo, step).in, !in).Wat retourneert de expressie 1..5 eigenlijk?
Het maakt een instantie aan van de klasse IntRange, die de interface ClosedRange<Int> implementeert. Het is geen collectie, maar een object dat de grenzen en de stap definieert. Lazy-implementatie.
Waarom is de stap (step) voor Range altijd 1? Hoe wijzig je de stap?
Standaard is de stap van een bereik gelijk aan 1 (of -1 bij downTo). Voor een andere stap worden de methoden step en downTo gebruikt. Bijvoorbeeld:
for (i in 2..10 step 2) println(i)
Kun je bereiken gebruiken met types die geen Comparable implementeren?
Nee, voor een correcte werking van een gebruikersbereik moet het type de interface Comparable implementeren, anders zal de operator rangeTo niet mogelijk zijn.
step te gebruiken.Een ontwikkelaar gebruikt een for-lus (i in 5..1) zonder downTo, in de veronderstelling dat het "5, 4, 3, 2, 1" zal zijn, maar de lus wordt nooit uitgevoerd.
Voordelen:
Nadelen:
Gebruik van progressie met downTo en step voor het doorlopen van rapporten met de gewenste interval, waardoor de code compact en zelfdocumenterend is.
Voordelen:
Nadelen: