Vnorené pre každého v Kotline

1. Úvod

V tomto krátkom návode na Kotlin sa pozrieme na rozsah parametrov vo vnútri a pre každý slučka lambda.

Najskôr definujeme údaje, ktoré použijeme v našich príkladoch. Po druhé, uvidíme, ako sa bude používať pre každý opakovať zoznam. Po tretie, pozrieme sa na to, ako sa to používa vo vnorených slučkách.

2. Testovacie údaje

Údaje, ktoré použijeme, sú zoznamy krajín, z ktorých každá obsahuje zoznam miest, ktoré zase obsahujú zoznam ulíc:

trieda Krajina (názov valca: String, mestá mesta: List) trieda Mesto (názov valcu: String, val ulice: Zoznam) trieda Svet {val streetsOfAmsterdam = listOf ("Herengracht", "Prinsengracht") val uliceOfBerlin = listOf ("Unter den" Linden "," Tiergarten ") val uliceOfMaastricht = listOf (" Grote Gracht "," Vrijthof ") krajiny valen = listOf (Krajina (" Holandsko ", listOf (Mesto (" Maastricht ", uliceOfMaastricht), Mesto (" Amsterdam ", uliceOfAmsterdam) ))), Krajina ("Nemecko", listOf (Mesto ("Berlín", uliceOfBerlin)))}} 

3. Jednoduché pre každý

Na vytlačenie názvu každej krajiny v zozname môžeme napísať nasledujúci kód:

fun allCountriesExplicit () {countries.forEach {c -> println (c.name)}} 

Vyššie uvedená syntax je podobná Java. Pokiaľ však v Kotline akceptuje lambda iba jeden parameter, môžeme použiť to ako predvolený názov parametra a nemusíte ho výslovne pomenovať:

fun allCountriesIt () {countries.forEach {println (it.name)}}

Vyššie uvedené je tiež ekvivalentné s:

fun allCountriesItExplicit () {countries.forEach {it -> println (it.name)}} 

Za zmienku stojí, že môžeme používať iba to ako názov implicitného parametra, ak neexistuje explicitný parameter.

Napríklad nefunguje nasledovné:

fun allCountriesExplicit () {countries.forEach {c -> println (it.name)}} 

Počas kompilácie sa zobrazí chyba:

Chyba: (2, 38) Kotlin: Nevyriešený odkaz: to 

4. Vnorené pre každý

Ak chceme iterovať vo všetkých krajinách, mestách a uliciach, môžeme napísať vnorenú slučku:

fun allNested () {countries.forEach {println (it.name) it.cities.forEach {println ("$ {it.name}") it.streets.forEach {println ("$ it")}}}} 

Tu prvý to odkazuje na krajinu, druhá to do mesta a tretí to na ulicu.

Ak však používame IntelliJ, zobrazí sa varovanie:

Implicitný parameter 'it' ohraničujúcej lambda je v tieni

To nemusí byť problém, ale v riadku 6 už nemôžeme odkazovať na krajinu alebo mesto. Ak to chceme, musíme explicitne pomenovať parameter:

fun allTable () {countries.forEach {c -> c.cities.forEach {p -> p.streets.forEach {println ("$ {c.name} $ {p.name} $ it")}}}} 

5. Alternatívy k vnoreným slučkám

Vnorené slučky sú všeobecne ťažko čitateľné a pokiaľ je to možné, mali by ste sa im vyhnúť. Jednou z možností je použitie flatMap ():

fun allStreetsFlatMap () {countries.flatMap {it.cities} .flatMap {it.streets} .forEach {println (it)}}

Pokiaľ však nepoužívame vnorené flatMap, nemôžeme získať prístup k názvu mesta alebo ulice v println vyhlásenie. Ak chceme mať rovnaký výstup ako vo vyššie uvedenej metóde allTable () a vyhnúť sa vnoreniu, mohli by sme pridať dve rozširujúce funkcie:

zábava City.getStreetsWithCityName (): Zoznam {spiatočných ulíc.map {"$ name, $ it"} .toList ()} zábava Country.getCitiesWithCountryName (): Zoznam {spiatočných miest.flatMap {it.getStreetsWithCityName ()}. mapa { "$ name, $ it"}}

A potom použite tieto dve metódy s jedinou flatMap:

fun allFlatMapTable () {countries.flatMap {it.getCitiesWithCountryName ()} .forEach {println (it)}}

6. Záver

V tomto krátkom článku sme videli, ako používať predvolený parameter to v Kotline a ako pristupovať k parametrom vonkajšej pre každý zvnútra vnoreného pre každý slučka. Nakoniec sme sa tiež pozreli na to, ako sa vyhnúť používaniu vnorených slučiek flatMap a rozširujúce funkcie.

Všetky útržky kódu v tomto článku nájdete v našom úložisku GitHub.


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