Como usar expressões de intervalo Kotlin
1. Introdução
Um intervalo é uma sequência de valores definidos por um início, um fim e uma etapa.
Neste tutorial rápido, veremos como podemos definir e usar intervalos no Kotlin.
2. Usando intervalos Kotlin
No Kotlin, podemos criar intervalos usando as funçõesrangeTo()edownTo() ou o .. operador.
Podemos usar intervalos para qualquer tipo comparável.
By default, they’re inclusive, o que significa que a expressão 1..4 corresponde aos valores 1,2,3 e 4.
Além disso,there’s another default: the distance entre dois valores, chamado de etapa, com um valor implícito de 1.
Então, agora, vamos dar uma olhada em alguns exemplos de criação de intervalos e uso de outros métodos úteis para manipulá-los.
2.1. Criando intervalos
Ranges implement a common interface – ClosedRange<T>. O resultado de aClosedRange é uma progressão(, comoIntProgression, LongProgression, ouCharProgression).
Esta progressão contém um início, um final inclusivo e uma etapa e é um subtipo deIterable<N>, onde N éInt, Long ouChar.
Vamos começar observando a maneira mais simples de criar um intervalo, usando os operadores “..” ein:
(i in 1..9)
Além disso, se quisermos definir um intervalo para trás, podemos usar o operadordownTo:
(i in 9 downTo 1)
Também podemos usar essa expressão como parte de uma instruçãoif para verificar se um valor pertence a um intervalo:
if (3 in 1..9)
print("yes")
2.2. Intervalos Iterantes
Agora, embora possamos usar intervalos com qualquer coisa comparável, se quisermos iterar, precisamos de um intervalo de tipo integral.
Agora, vamos dar uma olhada no código para iterar por meio de um intervalo:
for (i in 1.rangeTo(9)) {
print(i) // Print 123456789
}
for (i in 9.downTo(1)) {
print(i) // Print 987654321
}
O mesmo caso de uso se aplica aos caracteres:
for (ch in 'a'..'f') {
print(ch) // Print abcdef
}
for (ch in 'f' downTo 'a') {
print(ch) // Print fedcba
}
3. Usando a função step()
O uso da funçãostep() é bastante intuitivo:we can use it to define a distance entre os valores do intervalo:
for(i in 1..9 step 2) {
print(i) // Print 13579
}
for (i in 9 downTo 1 step 2) {
print(i) // Print 97531
}
Neste exemplo, estamos iterando para frente e para trás pelos valores de 1 a 9, com um valor de etapa de 2.
4. Usando a funçãoreversed()
Como o nome sugere, a funçãoreversed() inverterá a ordem do intervalo:
(1..9).reversed().forEach {
print(it) // Print 987654321
}
(1..9).reversed().step(3).forEach {
print(it) // Print 963
}
5. Usando a funçãountil()
Quando queremos criar um intervalo que exclui o elemento final, podemos usaruntil():
for (i in 1 until 9) {
print(i) // Print 12345678
}
6. Os elementoslast, first, step
Se precisarmos encontrar o primeiro, o passo ou o último valor do intervalo, existem funções que os devolverão para nós:
print((1..9).first) // Print 1
print((1..9 step 2).step) // Print 2
print((3..9).reversed().last) // Print 3
7. Faixas de filtragem
A funçãofilter() retornará uma lista de elementos que correspondem a um determinado predicado:
val r = 1..10
val f = r.filter { it -> it % 2 == 0 } // Print [2, 4, 6, 8, 10]
Também podemos aplicar outras funções, comomap()ereduce() ao nosso intervalo:
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. Outras funções de utilidade
Existem muitas outras funções que podemos aplicar ao nosso intervalo, comomin, max, sum, average, count, distinct:
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. Objetos personalizados
It’s also possible to create a range over custom objects. Para isso, o único requisito é estender a interfaceComparable.
Um enum é um bom exemplo. Todos os enums no Kotlin estendemComparable, o que significa que, por padrão, os elementos são classificados na sequência em que aparecem.
Vamos criar uma enumColor rápida:
enum class Color(val rgb: Int) : Comparable {
BLUE(0x0000FF),
GREEN(0x008000),
RED(0xFF0000),
MAGENTA(0xFF00FF),
YELLOW(0xFFFF00);
}
E, em seguida, use-o em algumas instruçõesif:
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
No entanto, como este não é um tipo integral, não podemos iterar sobre ele. Se tentarmos, obteremos um erro de compilação:
fun main(args: Array) {
for (c in Color.BLUE.rangeTo(Color.YELLOW)) println(c) // for-loop range must have an iterator() method
}
E se quisermos ter um intervalo personalizado que possamos iterar, só precisamos implementarClosedRange, bem comoIterator.
10. Conclusão
Neste artigo, demonstramos como podemos usar expressões de intervalo no Kotlin e diferentes funções que podemos aplicar.
Como sempre, o código-fonte está disponívelover on GitHub.