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.