Ugniježđeno forEach u Kotlinu

1. Uvod

U ovom kratkom tutorijalu za Kotlin pogledat ćemo opseg parametara unutar a za svakoga petlja lambda.

Prvo definiramo podatke koje ćemo koristiti u našim primjerima. Drugo, vidjet ćemo kako koristiti za svakoga prelistavati popis. Treće, pogledati ćemo kako ga koristiti u ugniježđenim petljama.

2. Podaci o ispitivanju

Podaci koje ćemo koristiti su popis zemalja, od kojih svaka sadrži popis gradova, a oni pak sadrže popis ulica:

klasa Država (val ime: Niz, val gradova: Popis) klasa Grad (val ime: Niz, val ulice: Popis) klasa Svijet {val uliceOfAmsterdam = listOf ("Herengracht", "Prinsengracht") val uliceOfBerlin = listOf ("Unter den Linden "," Tiergarten ") val streetOfMaastricht = listOf (" Grote Gracht "," Vrijthof ") val countries = listOf (Country (" Netherlands ", listOf (City (" Maastricht ", streetOfMaastricht), City (" Amsterdam ", streetOfAmsterdam) ))), Država ("Njemačka", listOf (Grad ("Berlin", ulice Berlina))))} 

3. Jednostavno za svakoga

Da bismo ispisali ime svake države s popisa, možemo napisati sljedeći kod:

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

Gornja sintaksa slična je Javi. Međutim, u Kotlinu, ako lambda prihvaća samo jedan parametar, možemo koristiti to kao zadani naziv parametra i ne treba ga izričito imenovati:

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

Navedeno je također ekvivalentno:

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

Vrijedno je napomenuti da možemo samo koristiti to kao implicitni naziv parametra ako nema eksplicitnog parametra.

Na primjer, sljedeće ne radi:

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

I vidjet ćemo pogrešku u vrijeme prevođenja:

Pogreška: (2, 38) Kotlin: Neriješena referenca: it 

4. Ugniježđeno za svakoga

Ako želimo ponoviti sve države, gradove i ulice, možemo napisati ugniježđenu petlju:

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

Evo, prva to odnosi se na zemlju, drugi to gradu i trećem to na ulicu.

Međutim, ako koristimo IntelliJ, vidimo upozorenje:

Implicitni parametar "it" zatvaranja lambda zasjenjen je

To možda ne bi bio problem, ali, u retku 6, više se ne možemo pozivati ​​na zemlju ili grad. Ako to želimo, moramo izričito imenovati parametar:

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

5. Alternative ugniježđenim petljama

Ugnježđene petlje općenito je teško čitati i treba ih izbjegavati ako je moguće. Jedna od mogućnosti je upotreba flatMap ():

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

Međutim, ako ne koristimo ugniježđeno flatMap, ne možemo pristupiti nazivu grada ili ulice u println izjava. Ako želimo imati isti izlaz kao u gornjoj metodi allTable () i da izbjegnemo gniježđenje, mogli bismo dodati dvije funkcije proširenja:

zabava City.getStreetsWithCityName (): Popis {povratak ulica.mapa {"$ ime, $ to"} .toList ()} zabava Country.getCitiesWithCountryName (): Lista {povratak gradova.flatMap {it.getStreetsWithCityName ()} .map { "$ ime, $ it"}}

A zatim upotrijebite ove dvije metode s jednom flatMap:

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

6. Zaključak

U ovom kratkom članku vidjeli smo kako se koristi zadani parametar to u Kotlinu i kako pristupiti parametrima vanjskog za svakoga iznutra ugniježđeno za svakoga petlja. Na kraju smo pogledali i kako izbjeći korištenje ugniježđenih petlji flatMap i funkcije produženja.

Svi isječci koda u ovom članku mogu se naći u našem spremištu GitHub.


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