Aralıklar (Range) ve ilerlemeler (Progression) — Kotlin'de belirli bir adım ile değer dizilerini temsil etmek için kullanılan yerleşik bir mekanizmadır. Genellikle döngülerde, koşullarda, koleksiyonları iterasyonda ve veri doğrulamada kullanılırlar. Range, Kotlin'in sözdizimini Java'ya göre daha özlü ve anlamlı hale getiren yöntemlerden biri olarak ortaya çıktı.
Java'da benzer görevler, çok kelimeli ve hatalara açık olan indeksli for ve while döngüleriyle çözülüyordu. Kotlin'de aralık oluşturmak için (örneğin, 1..10) ve adımları belirlemek için kompakt operatörler eklendi.
Kotlin, standart sayısal aralıklar (IntRange, LongRange, CharRange, UIntRange vb.) ve kendi ilerlemelerinizi oluşturmak için arayüzler sağlar:
Kod örneği:
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 // Değer kontrolü val x = 42 if (x in 1..100) println("Aralıkta!")
Kendi türleriniz için rangeTo ve Progression operatörlerini uygulayarak bir aralık tanımlayabilirsiniz:
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)
Anahtar özellikler:
start..end, downTo, step).in, !in).1..5 ifadesi aslında ne döndürür?
IntRange sınıfının bir örneğini oluşturur, bu da ClosedRange<Int> arayüzünü uygulamaktadır. Bu bir koleksiyon değildir, sınırları ve adımı tanımlayan bir nesnedir. Lazy-uygulama.
Range'in adım (step) değeri neden her zaman 1? Adımı nasıl değiştirebiliriz?
Varsayılan olarak aralığın adımı 1 (ya da downTo'da -1) olacaktır. Farklı bir adım için step ve downTo yöntemleri kullanılır. Örneğin:
for (i in 2..10 step 2) println(i)
Comparable'ı uygulamayan türlerle aralıkları kullanabilir miyiz?
Hayır, kullanıcı tanımlı aralığın düzgün çalışması için türün Comparable arayüzünü uygulaması gerekmektedir, aksi takdirde rangeTo operatörü mümkün olmayacaktır.
step yöntemini kullanmadan Range'in adımını değiştirmeye çalışmak.Geliştirici, for (i in 5..1) döngüsünü downTo olmadan kullanıyor ve 5, 4, 3, 2, 1 çıkmasını bekliyor, ancak döngü bir kez bile çalışmayacak.
Artılar:
Eksiler:
Gerekli aralıkla raporları döngü ile ilerletmek için downTo ve step ile ilerlemeyi kullanmak, kodu kompakt ve kendini belgeler hale getirir.
Artılar:
Eksiler: