Range e Progression — sono un meccanismo incorporato in Kotlin per rappresentare sequenze di valori con un passo definito. Sono spesso utilizzati nel lavoro con cicli, condizioni, iterazioni su collezioni e validazione dei dati. Il Range è emerso come uno dei modi per rendere la sintassi di Kotlin più concisa e espressiva rispetto a Java.
In Java, problemi simili venivano risolti tramite cicli for e while con indici — verbose e soggetti a errori. In Kotlin sono apparsi operatori compatti per la creazione di range (ad esempio, 1..10) e metodi per definire i passi.
Kotlin fornisce range numerici standard (IntRange, LongRange, CharRange, UIntRange, ecc.) e interfacce per creare proprie progressioni:
Esempio di codice:
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 // Controllo del valore val x = 42 if (x in 1..100) println("Nel range!")
È possibile definire un range per i propri tipi, implementando gli operatori rangeTo e Progression:
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)
Caratteristiche chiave:
start..end, downTo, step).in, !in).Cosa restituisce l'espressione 1..5 in realtà?
Crea un'istanza della classe IntRange, che implementa l'interfaccia ClosedRange<Int>. Non è una collezione, ma un oggetto che definisce i confini e il passo. Realizzazione lazy.
Perché il passo (step) di un Range è sempre 1? Come cambiarlo?
Per impostazione predefinita, lo step di un range è 1 (o -1 quando si usa downTo). Per un passo diverso si usano i metodi step e downTo. Ad esempio:
for (i in 2..10 step 2) println(i)
È possibile utilizzare range con tipi che non implementano Comparable?
No, per il corretto funzionamento di un range personalizzato, il tipo deve implementare l'interfaccia Comparable, altrimenti l'operatore rangeTo non sarà possibile.
step.Un sviluppatore utilizza il ciclo for (i in 5..1) senza downTo, aspettandosi di ottenere "5, 4, 3, 2, 1", mentre in realtà il ciclo non verrà mai eseguito.
Vantaggi:
Svantaggi:
Utilizzo della progressione con downTo e step per iterare su report con intervalli desiderati, rendendo il codice compatto e auto-documentato.
Vantaggi:
Svantaggi: