Egymásba fészkelődött Kotlinban

1. Bemutatkozás

Ebben a rövid Kotlin bemutatóban megnézzük a paraméter hatókörét az a-ban az egyes hurok lambda.

Először meghatározzuk azokat az adatokat, amelyeket a példáinkban felhasználunk. Másodszor, meglátjuk, hogyan kell használni az egyes hogy egy listán ismétlődjön. Harmadszor, megnézzük, hogyan lehet használni beágyazott ciklusokban.

2. Tesztadatok

Az általunk használt adatok az országok listáját tartalmazzák, amelyek mindegyike tartalmazza a városok listáját, amelyek viszont utcák listáját tartalmazzák:

osztály Ország (val név: String, val városok: Lista) class Város (val neve: String, val utcák: List) osztály Világ {val utcákOfAmsterdam = listOf ("Herengracht", "Prinsengracht") val utcákOfBerlin = listOf ("Unter den Linden "," Tiergarten ") val utcákOfMaastricht = listOf (" Grote Gracht "," Vrijthof ") val országok = listOf (Ország (" Hollandia ", listOf (Város (" Maastricht ", utcákOfMaastricht), Város (" Amszterdam ", utcákOmAsterdam) ))), Ország ("Németország", listOf (Város ("Berlin", utcákObBerlin)))}} 

3. Egyszerű az egyes

Az egyes országok nevének kinyomtatásához a következő kódot írhatjuk:

fun allCountriesExplicit () {országok.forEach {c -> println (c.név)}} 

A fenti szintaxis hasonló a Java-hoz. Kotlinban azonban, ha a lambda csak egy paramétert fogad el, akkor használhatjuk azt mint alapértelmezett paraméternév, és nem kell kifejezetten megneveznünk:

szórakoztató allCountriesIt () {country.forEach {println (it.name)}}

A fentiek szintén ekvivalensek:

szórakozás allCountriesItExplicit () {country.forEach {it -> println (it.name)}} 

Érdemes megjegyezni, hogy csak használni tudjuk azt implicit paraméter névként, ha nincs explicit paraméter.

Például a következő nem működik:

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

És hibát fogunk látni fordításkor:

Hiba: (2, 38) Kotlin: Megoldatlan hivatkozás: it 

4. Beágyazott az egyes

Ha iterálni akarunk minden országban, városban és utcában, akkor beírhatunk egy beágyazott hurkot:

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

Itt az első azt országra utal, a második azt egy városba és a harmadik azt utcára.

Ha azonban az IntelliJ alkalmazást használjuk, figyelmeztetést látunk:

A körülvevő lambda implicit 'it' paramétere árnyékolt

Lehet, hogy ez nem jelent problémát, de a 6. sorban már nem hivatkozhatunk az országra vagy a városra. Ha ezt akarjuk, akkor kifejezetten meg kell neveznünk a paramétert:

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

5. A beágyazott hurkok alternatívái

A beágyazott hurkok általában nehezen olvashatók, és lehetőség szerint kerülni kell őket. Az egyik lehetőség a használat flatMap ():

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

Ha azonban nem használunk beágyazottat flatMap, nem érhetjük el a várost vagy az utcanevet a println nyilatkozat. Ha a fenti módszerrel megegyező kimenetet akarunk elérni allTable () és elkerülhetjük a fészkelést, két kiterjesztési funkciót adhatunk hozzá:

fun City.getStreetsWithCityName (): List {visszatérő utcák.map {"$ name, $ it"} .toList ()} fun Country.getCitiesWithCountryName (): List {return városok.flatMap {it.getStreetsWithCityName ()} .térkép { "$ name, $ it"}}

Ezután használja ezt a két módszert egyetlen flatMap:

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

6. Következtetés

Ebben a rövid cikkben láttuk, hogyan kell használni az alapértelmezett paramétert azt Kotlinban és hogyan lehet elérni egy külső paramétereit az egyes belülről beágyazott az egyes hurok. Végül azt is megvizsgáltuk, hogyan lehet elkerülni a beágyazott hurkok használatát flatMap és kiterjesztési funkciók.

A cikk összes kódrészlete megtalálható a GitHub-adattárunkban.


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