Як використовувати вирази діапазону Kotlin

1. Вступ

Діапазон - це послідовність значень, визначених початком, кінцем та кроком.

У цьому короткому посібнику ми розглянемо, як ми можемо визначити та використовувати діапазони в Kotlin.

2. Використання діапазонів Котліна

У Kotlin ми можемо створювати діапазони, використовуючи функції rangeTo () і downTo () або оператор ...

Ми можемо використовувати діапазони для будь-якого порівняльного типу.

За замовчуванням вони включені, що означає, що вираз 1..4 відповідає значенням 1,2,3 та 4.

Крім того, є ще одне за замовчуванням: відстань між двома значеннями, що називається кроком, з неявним значенням 1.

Отже, давайте розглянемо кілька прикладів створення діапазонів та використання інших корисних методів для маніпулювання ними.

2.1. Створення діапазонів

Діапазони реалізують загальний інтерфейс - ClosedRange. Результатом ClosedRange є прогресія ( така як IntProgression, LongProgression або CharProgression).

Ця прогресія містить початок, інклюзивний кінець і крок, і це підтип Iterable, де N - це Int, Long або Char .

Почнемо з того, що розглянемо найпростіший спосіб створити діапазон, використовуючи ".." та в операторах:

(i in 1..9)

Крім того, якщо ми хочемо визначити зворотний діапазон, ми можемо використовувати оператор downTo :

(i in 9 downTo 1) 

Ми також можемо використовувати цей вираз як частину оператора if, щоб перевірити, чи належить значення діапазону:

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

2.2. Діапазони ітерацій

Тепер, хоча ми можемо використовувати діапазони з чим-небудь порівнянним, якщо ми хочемо виконати ітерацію, нам потрібен інтегральний діапазон типів.

Тепер давайте подивимось на код для ітерації через діапазон:

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

Той самий варіант використання застосовується до символів:

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

3. Використання сек ТЕП () Функція

Використання функції step () досить інтуїтивне: ми можемо використовувати її для визначення відстані між значеннями діапазону:

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

У цьому прикладі ми виконуємо ітерацію вперед і назад через значення з 1-9 із значенням кроку 2.

4. Використовуючи зворотний () Функція

Як випливає з назви, функція reversed () змінить порядок діапазону:

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

5. Використання до () Функція

Коли ми хочемо створити діапазон, який виключає кінцевий елемент, ми можемо використовувати до ():

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

6. Останній, перший, кроковий елементи

Якщо нам потрібно знайти перше, крок або останнє значення діапазону, є функції, які повернуть нам їх:

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

7. Діапазони фільтрації

Функція filter () поверне список елементів, що відповідають даному предикату:

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

Ми також можемо застосувати інші функції, такі як map () та reduce () до нашого діапазону:

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. Інші утилітні функції

There are many other functions we can apply to our range, like min, 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. Custom Objects

It's also possible to create a range over custom objects. For that, the only requirement is to extend the Comparable interface.

An enum is a good example. All enums in Kotlin extend Comparable which means that, by default, the elements are sorted in the sequence they appear.

Let's create a quick Color enum:

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

And then use it in some if statements:

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

However, as this is not an integral type, we can't iterate over it. If we try, we'll get a compilation error:

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

І якщо ми хочемо мати власний діапазон, який ми можемо повторити, нам просто потрібно реалізувати ClosedRange , а також Iterator.

10. Висновок

У цій статті ми продемонстрували, як ми можемо використовувати вирази діапазону в Kotlin та різні функції, які ми можемо застосувати.

Як завжди, вихідний код доступний на GitHub.