カスタムオブジェクトでのKotlin範囲イテレーターの作成

1. 前書き

前の記事で、https://www.baeldung.com/kotlin-ranges [Kotlinで範囲を作成する方法]、および_Int、Long _、_ Char_型を反復処理するのがいかに簡単かを示しました。
しかし、*カスタムタイプを反復したい場合はどうでしょうか? 出来ますか? 答えはイエスです! それでは、コードに飛び込んで、その方法を見てみましょう。

2. カラフルなタイプ

RGBカラーを表す単純なクラスがあると想像してみましょう。
class CustomColor(val rgb: Int): Comparable<CustomColor> {}
さまざまなRGBカラーを反復処理できると便利です。
val a = CustomColor(0x000000)
val b = CustomColor(0xCCCCCC)
for (cc in a..b) {
   // do things
}

3. _IntRange_の概要

簡単に言えば、* _Comparable_、_Iterable_、および_ClosedRange ._ *を実装する必要があります。 _
他の2つのインターフェイスについては、いくつかのヒントについて_IntRange_クラス宣言に飛び込みましょう。
public class IntRange(start: Int, endInclusive: Int) :
  IntProgression(start, endInclusive, 1), ClosedRange<Int>
そして、_IntProgression_ ’の宣言は、_Iterable <Int>:_を実装することを示しています
public open class IntProgression : Iterable<Int>
それで、私たちはこの仕事をするために似たようなことをしたいと思うでしょう。

4. _ColorRange_クラス

_IntRange_と同様に、_ColorRange_クラスを作成しましょう。
目的のために、_IntProgression、_の模倣もスキップします。*デフォルトのステップ1で大丈夫です*。
class ColorRange(override val start: CustomColor,
  override val endInclusive: CustomColor) : ClosedRange<CustomColor>, Iterable<CustomColor>{

    override fun iterator(): Iterator<CustomColor> {
        return ColorIterator(start, endInclusive)
    }
}
_iterator()_を実装するために、実際に範囲をステップスルーするという重い作業を行う* _ColorIterator_クラスを返します。*
_ColorRange_は_ClosedRange <T:Comparable <T >> _インターフェイスを実装するため、_CustomColor_クラスで_compareTo_メソッドを実装する必要があります。
override fun compareTo(other: CustomColor): Int {
    return this.rgb.compareTo(other.rgb)
}

5. _ColorIterator_クラス

  • _ColorIterator_はパズルの最後のピースです*:

class ColorIterator(val start: CustomColor, val endInclusive: CustomColor) : Iterator<CustomColor> {

    var initValue = start

    override fun hasNext(): Boolean {
        return initValue <= endInclusive
    }

    override fun next(): CustomColor {
        return initValue++
    }
}
_initValue_は_CustomColor._型であることに注意してください。したがって、_ ++ _演算子で変更するには、_CustomColor_にも_inc()_メソッドを追加する必要があります。
operator fun inc(): CustomColor {
    return CustomColor(rgb + 1)
}

6. カスタム範囲の使用

もうすぐだ!
カスタム範囲を定義しているため、_CustomColor_クラスは_rangeTo_メソッドを実装する必要があります。 * _rangeTo_メソッドを使用すると、_.._演算子を使用して範囲を反復処理できます*。
最終製品をチェックしてみましょう。
class CustomColor(val rgb: Int): Comparable<CustomColor> {

    override fun compareTo(other: CustomColor): Int {
        return this.rgb.compareTo(other.rgb)
    }

    operator fun rangeTo(that: CustomColor) = ColorRange(this,that)

    operator fun inc(): CustomColor {
        return CustomColor(rgb + 1)
    }
}
*そして、私たちが必要とするすべてです!*
最後に、_CustomColor_クラスの範囲を使用して、これらすべてがどのように連携するかを見てみましょう*:
@Test
fun assertHas10Colors(){
    assertTrue {
        val a = CustomColor(1)
        val b = CustomColor(10)
        val range = a..b
        for (cc in range) {
            println(cc)
        }
        range.toList().size == 10
    }
}
このテストでは、_range_変数を定義し、_CustomColor_オブジェクトを反復処理し、リストに変換するために使用しました。
範囲で標準の_contains_メソッドを使用する別の例を見てみましょう。
@Test
fun assertContains0xCCCCCC(){
    assertTrue {
        val a = CustomColor(0xBBBBBB)
        val b = CustomColor(0xDDDDDD)
        val range = a..b
        range.contains(CustomColor(0xCCCCCC))
    }
}

7. 結論

Kotlinには、_Int、Long_、および_Char_値の範囲のネイティブ実装があります。 この記事では、カスタムクラスに範囲を実装する方法を学びました。
いつものように、コードはhttps://github.com/eugenp/tutorials/tree/master/core-kotlin-2[GitHub]で入手できます。