מקונן לכל אחד בקוטלין

1. הקדמה

במדריך קצר זה של קוטלין נבחן את היקף הפרמטרים בתוך a לכל אחד הלמבה של לולאה.

ראשית, אנו מגדירים את הנתונים בהם נשתמש בדוגמאות שלנו. שנית, נראה כיצד להשתמש לכל אחד לחזור על רשימה. שלישית, נבדוק כיצד להשתמש בו בלולאות מקוננות.

2. נתוני בדיקה

הנתונים בהם נשתמש הם רשימה של מדינות, שכל אחת מהן מכילה רשימת ערים, שמצידה מכילה רשימת רחובות:

class מדינה (שם val: מחרוזת, ערים val: רשימה) מחלקה עיר (שם val: מחרוזת, רחובות val: רשימה) class עולם {val streetsOfAmsterdam = listOf ("Herengracht", "Prinsengracht") val streetsOfBerlin = listOf ("Unter den Linden "," Tiergarten ") val streetsOfMaastricht = listOf (" Grote Gracht "," Vrijthof ") val countries = listOf (Country (" Netherlands ", listOf (City (" Maastricht ", streetsOfMaastricht), City (" Amsterdam ", streetsOfAmsterdam) ))), מדינה ("גרמניה", listOf (עיר ("ברלין", רחובותOfBerlin)))} 

3. פשוט לכל אחד

כדי להדפיס את השם של כל מדינה ברשימה, נוכל לכתוב את הקוד הבא:

כיף allCountriesExplicit () {country.forEach {c -> println (c.name)}} 

התחביר הנ"ל דומה ל- Java. עם זאת, בקוטלין, אם למבדה מקבל פרמטר אחד בלבד, נוכל להשתמש בו זה כשם הפרמטר המוגדר כברירת מחדל ואין צורך למנות אותו במפורש:

כיף allCountriesIt () {country.forEach {println (it.name)}}

האמור לעיל שווה ערך גם ל:

כיף allCountriesItExplicit () {country.forEach {it -> println (it.name)}} 

כדאי לציין שאנחנו יכולים להשתמש רק זה כשם פרמטר מרומז אם אין פרמטר מפורש.

לדוגמה, הדברים הבאים לא עובדים:

כיף allCountriesExplicit () {country.forEach {c -> println (it.name)}} 

ונראה שגיאה בזמן הידור:

שגיאה: (2, 38) קוטלין: התייחסות לא פתורה: זה 

4. מקונן לכל אחד

אם אנו רוצים לחזור על כל המדינות, הערים והרחובות, אנו יכולים לכתוב לולאה מקוננת:

כיף allNested () {country.forEach {println (it.name) it.cities.forEach {println ("$ {it.name}") it.streets.forEach {println ("$ it")}}} 

הנה, הראשון זה מתייחס למדינה, השנייה זה לעיר והשלישית זה לרחוב.

עם זאת, אם אנו משתמשים ב- IntelliJ, אנו רואים אזהרה:

הפרמטר המרומז 'זה' של סגירת למבדה מוצל

זו אולי לא בעיה, אך בשורה 6 איננו יכולים להתייחס למדינה או לעיר יותר. אם אנו רוצים בכך, עלינו למנות את הפרמטר במפורש:

כיף allTable () {country.forEach {c -> c.cities.forEach {p -> p.streets.forEach {println ("$ {c.name} $ {p.name} $ it")}}}} 

5. חלופות לולאות מקוננות

לולאות מקוננות בדרך כלל קשות לקריאה ויש להימנע מהן במידת האפשר. אפשרות אחת היא להשתמש flatMap ():

כיף allStreetsFlatMap () {country.flatMap {it.cities} .flatMap {it.streets} .forEach {println (it)}}

עם זאת, אם איננו משתמשים בקן flatMap, איננו יכולים לגשת לשם העיר או הרחוב ב println הַצהָרָה. אם אנו רוצים לקבל את אותה הפלט כמו בשיטה לעיל allTable () ולהימנע מקינון, נוכל להוסיף שתי פונקציות הרחבה:

כיף City.getStreetsWithCityName (): רשימת {return streets.map {"$ name, $ it"} .toList ()} fun Country.getCitiesWithCountryName (): רשימה {return cities.flatMap {it.getStreetsWithCityName ()}. מפה { "$ name, $ it"}}

ואז השתמש בשתי שיטות אלה עם אחת flatMap:

כיף allFlatMapTable () {country.flatMap {it.getCitiesWithCountryName ()}. forEach {println (it)}}

6. מסקנה

במאמר קצר זה ראינו כיצד להשתמש בפרמטר ברירת המחדל זה בקוטלין וכיצד לגשת לפרמטרים של חיצוני לכל אחד מתוך מקונן לכל אחד לוּלָאָה. לבסוף בדקנו גם כיצד להימנע מלולאות מקוננות באמצעות flatMap ופונקציות הרחבה.

כל קטעי הקוד במאמר זה נמצאים במאגר GitHub שלנו.


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