Vytvorenie kotlinského rozsahu Iterátora na vlastnom objekte

1. Úvod

V predchádzajúcom článku sme si ukázali, ako môžeme v Kotline vytvoriť rozsah a aké ľahké je iterovať Int, Long a Char typy.

Ale čo keď chceme iterácia nad vlastným typom? Je to možné? Odpoveď je áno! Poďme teda skočiť do kódu a uvidíme ako.

2. Farebný typ

Poďme si predstaviť, že máme jednoduchú triedu, ktorá predstavuje farbu RGB:

trieda CustomColor (val rgb: Int): porovnateľná {} 

Bolo by pekné mať možnosť iterovať s rôznymi farbami RGB:

val a = CustomColor (0x000000) val b = CustomColor (0xCCCCCC) pre (cc v a..b) {// robiť veci}

3. Rýchly pohľad do IntRange

Jednoducho povedané, budeme musieť implementovať Porovnateľné, Iterablea Uzavretý rozsah. Z nášho predchádzajúceho článku už vieme, že ho budeme musieť implementovať Porovnateľné.

Pokiaľ ide o ďalšie dve rozhrania, ponorme sa do IntRange deklarácia triedy pre niektoré rady:

verejná trieda IntRange (štart: Int, endInclusive: Int): IntProgression (start, endInclusive, 1), ClosedRange 

A potom, IntprogresiaDeklarácia ukazuje, že sa vykonáva Iterovateľné:

verejná otvorená trieda IntProgression: Iterable

Budeme teda chcieť urobiť niečo podobné, aby to fungovalo.

4. Farebná škála Trieda

Páči sa mi to IntRange, vytvorme a Farebná škála trieda.

Pre naše účely preskočíme napodobňovanie Introgresia, tiež, odkedy sme v poriadku, že máme predvolený krok 1. To trochu zjednoduší veci a umožní nám to jednoducho implementovať oboje Uzavretý rozsah a Iterable priamo:

class ColorRange (override val start: CustomColor, override val endInclusive: CustomColor): ClosedRange, Iterable {override fun iterator (): Iterator {return ColorIterator (start, endInclusive)}}

Za našu implementáciu iterátor (), vrátime a ColorIterator triedy, ktorá urobí ťažké zdvíhanie skutočného prešliapania rozsahu.

Pretože Farebná škála realizuje Uzavretý rozsah rozhranie, musíme implementovať porovnať s metóda na CustomColor trieda:

prepísať zábavu porovnaťTo (other: CustomColor): Int {return this.rgb.compareTo (other.rgb)}

5. ColorIterator Trieda

ColorIterator je posledný kúsok skladačky:

class ColorIterator (val start: CustomColor, val endInclusive: CustomColor): Iterator {var initValue = start override fun hasNext (): Boolean {return initValue <= endInclusive} override fun next (): CustomColor {return initValue ++}}

Poznač si to initValue je typu CustomColor. Takže, mutovať to s ++ operátor, budeme musieť pridať inc () metóda do CustomColor tiež:

operator fun inc (): CustomColor {return CustomColor (rgb + 1)}

6. Používanie vlastného rozsahu

Už sme skoro tam!

Keďže definujeme náš vlastný rozsah, CustomColor trieda musí implementovať rangeTo metóda. The rangeTo Metóda nám umožní iterovať náš rozsah pomocou .. operátor, niečo ako pridávanie nám umožňuje používať ++ operátor.

Pozrime sa na konečný produkt:

trieda CustomColor (val rgb: Int): porovnateľný {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)}}

A to je všetko, čo potrebujeme!

Na záver sa pozrime, ako to všetko spolu funguje pomocou radu našich CustomColor trieda:

@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}}

V tomto teste sme definovali a rozsah premenná a slúži na iteráciu cez CustomColor objekty, ako aj transformovať do zoznamu.

Pozrime sa na ďalší príklad použitia normy obsahuje metóda v rozsahu:

@Test fun assertContains0xCCCCCC () {assertTrue {val a = CustomColor (0xBBBBBB) val b = CustomColor (0xDDDDDD) val rozsah = a..b range.contains (CustomColor (0xCCCCCC))}}

7. Záver

Kotlin má natívnu implementáciu rozsahu pre Int, Long a Char hodnoty. V tomto článku sme sa naučili, ako implementovať rozsah na vlastnej triede.

Ako vždy, kód je k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found