Come usare Kotlin Range Expressions

1. Introduzione

Un intervallo è una sequenza di valori definita da un inizio, una fine e un passaggio.

In questo rapido tutorial, daremo un'occhiata a come possiamo definire e utilizzare gli intervalli in Kotlin.

2. Utilizzo degli intervalli di Kotlin

In Kotlin, possiamo creare intervalli utilizzando le funzioni rangeTo () e downTo () o l'operatore ...

Possiamo utilizzare intervalli per qualsiasi tipo comparabile.

Per impostazione predefinita, sono inclusivi, il che significa che l'espressione 1..4 corrisponde ai valori 1,2,3 e 4.

Inoltre, c'è un'altra impostazione predefinita: la distanza tra due valori, chiamata passo, con un valore implicito di 1.

Quindi ora, diamo un'occhiata ad alcuni esempi di creazione di intervalli e utilizzo di altri metodi utili per manipolarli.

2.1. Creazione di intervalli

Gli intervalli implementano un'interfaccia comune: ClosedRange. Il risultato di un ClosedRange è una progressione ( come IntProgression, LongProgression o CharProgression).

Questa progressione contiene un inizio, una fine inclusiva e un passaggio ed è un sottotipo di Iterable dove N è Int, Long o Char .

Iniziamo osservando il modo più semplice per creare un intervallo, utilizzando gli operatori ".." e in :

(i in 1..9)

Inoltre, se vogliamo definire un intervallo all'indietro possiamo usare l' operatore downTo :

(i in 9 downTo 1) 

Possiamo anche usare questa espressione come parte di un'istruzione if per verificare se un valore appartiene a un intervallo:

if (3 in 1..9) print("yes")

2.2. Intervalli ripetitivi

Ora, mentre possiamo usare intervalli con qualcosa di paragonabile, se vogliamo iterare, allora abbiamo bisogno di un intervallo di tipo integrale.

Ora diamo un'occhiata al codice per scorrere un intervallo:

for (i in 1.rangeTo(9)) { print(i) // Print 123456789 } for (i in 9.downTo(1)) { print(i) // Print 987654321 }

Lo stesso caso d'uso si applica ai caratteri:

for (ch in 'a'..'f') { print(ch) // Print abcdef } for (ch in 'f' downTo 'a') { print(ch) // Print fedcba }

3. Utilizzando la s tep () Funzione

L'utilizzo della funzione step () è abbastanza intuitivo: possiamo usarla per definire una distanza tra i valori del range:

for(i in 1..9 step 2) { print(i) // Print 13579 } for (i in 9 downTo 1 step 2) { print(i) // Print 97531 }

In questo esempio, stiamo iterando avanti e indietro attraverso i valori da 1 a 9, con un valore di passo di 2.

4. Utilizzando la ) (invertita Funzione

Come suggerisce il nome, la funzione reversed () invertirà l'ordine dell'intervallo:

(1..9).reversed().forEach { print(it) // Print 987654321 } (1..9).reversed().step(3).forEach { print(it) // Print 963 }

5. Utilizzando il fino) ( Funzione

Quando vogliamo creare un intervallo che escluda l'elemento finale possiamo usare until ():

for (i in 1 until 9) { print(i) // Print 12345678 }

6. L' ultimo, il primo, passaggio Elementi

Se dobbiamo trovare il primo, il passo o l'ultimo valore dell'intervallo, ci sono funzioni che ce li restituiranno:

print((1..9).first) // Print 1 print((1..9 step 2).step) // Print 2 print((3..9).reversed().last) // Print 3

7. Intervalli di filtraggio

La funzione filter () restituirà un elenco di elementi che corrispondono a un dato predicato:

val r = 1..10 val f = r.filter { it -> it % 2 == 0 } // Print [2, 4, 6, 8, 10]

Possiamo anche applicare altre funzioni come map () e reduce () al nostro intervallo:

val m = r.map { it -> it * it } // Print [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] val rdc = r.reduce{a, b -> a + b} // Print 55 

8. Altre funzioni di utilità

Ci sono molte altre funzioni che possiamo applicare al nostro intervallo, come min, max, sum, average, count, distinto :

val r = 1..20 print(r.min()) // Print 1 print(r.max()) // Print 20 print(r.sum()) // Print 210 print(r.average()) // Print 10.5 print(r.count()) // Print 20 val repeated = listOf(1, 1, 2, 4, 4, 6, 10) print(repeated.distinct()) // Print [1, 2, 4, 6, 10] 

9. Oggetti personalizzati

È anche possibile creare un intervallo su oggetti personalizzati. Per questo, l'unico requisito è estendere l' interfaccia Comparable .

Un enum è un buon esempio. Tutte le enumerazioni in Kotlin estendono Comparable, il che significa che, per impostazione predefinita, gli elementi sono ordinati nella sequenza in cui appaiono.

Creiamo una rapida enumerazione del colore :

enum class Color(val rgb: Int) : Comparable { BLUE(0x0000FF), GREEN(0x008000), RED(0xFF0000), MAGENTA(0xFF00FF), YELLOW(0xFFFF00); } 

E poi usalo in alcune istruzioni if :

val range = red..yellow if (range.contains(Color.MAGENTA)) println("true") // Print true if (Color.RED in Color.GREEN..Color.YELLOW) println("true") // Print true if (Color.RED !in Color.MAGENTA..Color.YELLOW) println("true") // Print true

Tuttavia, poiché questo non è un tipo integrale, non possiamo iterare su di esso. Se proviamo, otterremo un errore di compilazione:

fun main(args: Array) { for (c in Color.BLUE.rangeTo(Color.YELLOW)) println(c) // for-loop range must have an iterator() method }

E se vogliamo avere un intervallo personalizzato su cui possiamo iterare, dobbiamo solo implementare ClosedRange e Iterator.

10. Conclusione

In questo articolo, abbiamo dimostrato come possiamo usare espressioni di intervallo in Kotlin e diverse funzioni che possiamo applicare.

Come sempre il codice sorgente è disponibile su GitHub.