סקירה כללית של ממשק ה- API של Kotlin Collections

1. סקירה כללית

במדריך מהיר זה, נציג את ה- API של אוספי Kotlin, ונדון בסוגי האוסף השונים בקוטלין ובכמה פעולות נפוצות באוספים.

2. אוסף לעומת אוסף משתנה

ראשית, בואו נסתכל על סוגים שונים של אוספים בקוטלין. נראה כיצד לאתחל את סוגי האוספים הבסיסיים.

ה אוסף ממשק תומך בשיטות לקריאה בלבד בזמן אוסף משתנה תומך בשיטות קריאה / כתיבה.

2.1. רשימה

אנו יכולים ליצור קריאה בלבד רשימה באמצעות שיטה רשימה של() ולקרוא-לכתוב MutableList באמצעות mutableListOf ():

val theList = listOf ("one", "two", "three") val theMutableList = mutableListOf ("one", "two", "three")

2.2. מַעֲרֶכֶת

באופן דומה אנו יכולים ליצור קריאה בלבד מַעֲרֶכֶת באמצעות שיטה setOf () ולקרוא-לכתוב MutableSet באמצעות mutableSetOf ():

val theSet = setOf ("one", "two", "three") val theMutableSet = mutableSetOf ("one", "two", "three")

2.3. מַפָּה

אנחנו יכולים גם ליצור קריאה בלבד מַפָּה באמצעות שיטה מפה של() ולקרוא-לכתוב מפה משתנה באמצעות mutableMapOf ():

val theMap = mapOf (1 ל- "one", 2 ל- "two", 3 to "three") val theMutableMap = mutableMapOf (1 ל- "one", 2 ל- "two", 3 ל- "three")

3. מפעילים שימושיים

ממשק ה- API של אוספי קוטלין עשיר בהרבה מזה שאנחנו יכולים למצוא בג'אווה - הוא מגיע עם קבוצה של מפעילים עמוסים מדי.

3.1. ה "ב ” מַפעִיל

אנחנו יכולים להשתמש בביטוי "x באוסף"שאפשר לתרגם ל collection.contains (x):

@Test fun whenSearchForExistingItem_thenFound () {val theList = listOf ("one", "two", "three") assertTrue ("two" in theList)}

3.2. ה “+” מַפעִיל

אנו יכולים רכיב או אוסף שלם לאחרים באמצעות אופרטור "+":

@Test fun whenJoinTwoCollections_thenSuccess () {val firstList = listOf ("one", "two", "three") val secondList = listOf ("four", "five", "six") val resultList = firstList + secondList assertEquals (6 , resultList.size) assertTrue (resultList.contains ("two")) assertTrue (resultList.contains ("five"))}

3.3. ה “-“ מַפעִיל

באופן דומה, אנו יכולים להסיר אלמנט או מספר אלמנטים באמצעות אופרטור "-":

@Test fun whenExcludeItems_thenRemoved () {val firstList = listOf ("one", "two", "three") val secondList = listOf ("one", "three") val resultList = firstList - secondList assertEquals (1, resultList.size ) assertTrue (resultList.contains ("שניים"))}

4. שיטות אחרות

לבסוף, נחקור כמה שיטות נפוצות לאיסוף. בג'אווה, אם נרצה למנף שיטות מתקדמות, נצטרך להשתמש זרם ממשק API.

בקוטלין נוכל למצוא שיטות דומות הזמינות בממשק ה- API של Collections.

4.1. פִּלוּחַ

אנו יכולים להשיג רשימת משנה מנתון רשימה:

@Test fun whenSliceCollection_thenSuccess () {val theList = listOf ("one", "two", "three") val resultList = theList.slice (1..2) assertEquals (2, resultList.size) assertTrue (resultList.contains ( "שתיים")) }

4.2. מסיר

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

@Test fun whenFilterNullValues_thenSuccess () {val theList = listOf ("one", null, "two", null, "three") val resultList = theList.filterNotNull () assertEquals (3, resultList.size)}

4.3. סִנוּן

אנו יכולים לסנן פריטי אוסף בקלות באמצעות פילטר(), שעובד בדומה ל- לְסַנֵן() שיטה מג'אווה זרם ממשק API:

@Test fun whenFilterNonPositiveValues_thenSuccess () {val theList = listOf (1, 2, -3, -4, 5, -6) val resultList = theList.filter {it> 0} assertEquals (3, resultList.size) assertTrue (resultList. מכיל (1)) assertFalse (resultList.contains (-4))}

4.4. הַפָּלָה

אנו יכולים להוריד את הפריטים הראשונים ב- N:

@Test fun whenDropFirstItems_thenRemoved () {val theList = listOf ("one", "two", "three", "four") val resultList = theList.drop (2) assertEquals (2, resultList.size) assertFalse (resultList.contains ("אחד")) assertFalse (resultList.contains ("שניים"))}

אנו יכולים להוריד את הפריטים הראשונים אם הם עומדים בתנאי הנתון:

@Test fun whenDropFirstItemsBasedOnCondition_thenRemoved () {val theList = listOf ("one", "two", "three", "four") val resultList = theList.dropWhile {it.length <4} assertEquals (2, resultList.size) assertFalse (resultList.contains ("one")) assertFalse (resultList.contains ("two"))}

4.5. הַקבָּצָה

אנו יכולים לקבץ אלמנטים:

@Test fun whenGroupItems_thenSuccess () {val theList = listOf (1, 2, 3, 4, 5, 6) val resultMap = theList.groupBy {it% 3} assertEquals (3, resultMap.size) assertTrue (resultMap [1]! ! .contains (1)) assertTrue (resultMap [2] !!. מכיל (5))}

4.6. מיפוי

אנו יכולים למפות את כל האלמנטים באמצעות הפונקציה המסופקת:

@Test fun whenApplyFunctionToAllItems_thenSuccess () {val theList = listOf (1, 2, 3, 4, 5, 6) val resultList = theList.map {it * it} assertEquals (4, resultList [1]) assertEquals (9, resultList [ 2])}

אנחנו יכולים להשתמש flatMap () לשטוח אוספים מקוננים. הנה, אנו ממירים מיתרים לist ולהימנע מסיום עם רשימה:

@Test fun whenApplyMultiOutputFunctionToAllItems_thenSuccess () {val theList = listOf ("John", "Tom") val resultList = theList.flatMap {it.toLowerCase (). ToList ()} assertEquals (7, resultList.size)}

4.7. צִמצוּם

אנחנו יכולים להופיע לקפל / להקטין מבצע:

@Test fun whenApplyFunctionToAllItemsWithStartingValue_thenSuccess () {val theList = listOf (1, 2, 3, 4, 5, 6) val finalResult = theList.fold (0, {acc, i -> acc + (i * i)}) assertEquals ( 91, finalResult)}

4.8. חתיכות

כדי לפרק אוסף לגושים בגודל נתון, נוכל להשתמש ב- chunked () שיטה:

@Test fun whenApplyingChunked_thenShouldBreakTheCollection () {val theList = listOf (1, 2, 3, 4, 5) val chunked = theList.chunked (2) assertThat (chunked.size) .isEqualTo (3) assertThat (chunked.first ()) מכיל (1, 2) assertThat (chunked [1]). מכיל (3, 4) assertThat (chunked.last ()). מכיל (5)}

מכיוון שהאוסף כולל חמישה אלמנטים, ה- מגושם (2) method call מחזיר שני אוספים עם שני אלמנטים כל אחד ואוסף אחד של אלמנטים בודדים.

ניתן גם למפות כל נתח למשהו אחר לאחר פירוק האוסף:

@Test fun whenApplyingChunkedWithTransformation_thenShouldBreakTheCollection () {val theList = listOf (1, 2, 3, 4, 5) val chunked = theList.chunked (3) {it.joinToString (",")} assertThat (chunked.size) .isEqualTo 2) assertThat (chunked.first ()). IsEqualTo ("1, 2, 3") assertThat (chunked.last ()). IsEqualTo ("4, 5")}

לאחר יצירת נתחים בגודל 3, אנו ממירים כל נתח למחרוזת מופרדת בפסיקים.

4.9. חלילה

ה חלון () פונקציה מחזירה רשימה של טווחי אלמנטים על ידי העברת חלון הזזה בגודל נתון מעל אוסף אלמנטים.

על מנת להבין זאת טוב יותר, בואו נראה כיצד חלון חלון (3) עובד על אוסף של 6 אלמנטים:

בהתחלה, גודל החלון הוא 3, ולכן הרשימה הראשונה תכיל 1, 2 ו- 3. ואז חלון ההזזה מעביר אלמנט אחד נוסף:

חלון ההזזה נע קדימה עד שהוא לא מצליח ליצור רשימה נוספת בגודל הנתון:

רצף מעברים זה מתבטא בקוד קוטלין כ:

@Test fun whenApplyingWindowed_thenShouldCreateSlidingWindowsOfElements () {val theList = (1..6). ToList () val windowed = theList.windowed (3) assertThat (windowed.size) .isEqualTo (4) assertThat (windowed.first ()) מכיל. (1, 2, 3) assertThat (חלון [1]). מכיל (2, 3, 4) assertThat (חלון [2]). מכיל (3, 4, 5) assertThat (חלון. אחרון ()). מכיל ( 4, 5, 6)}

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

@Test fun whenApplyingWindowedWithTwoSteps_thenShouldCreateSlidingWindowsOfElements () {val theList = (1..6). ToList () val windowed = theList.windowed (size = 3, step = 2) assertThat (windowed.size) .isEqualTo (2) assert. first ()). מכיל (1, 2, 3) assertThat (windowed.last ()). מכיל (3, 4, 5)}

ה חלון () פונקציה, כברירת מחדל, תמיד ויוצרת טווחים בגודל הנתון. כדי לשנות זאת, אנו יכולים להגדיר את ה- partialWindows פרמטר ל נָכוֹן:

@Test fun whenApplyingPartialWindowedWithTwoSteps_thenShouldCreateSlidingWindowsOfElements () {val theList = (1..6). ToList () val windowed = theList.windowed (size = 3, step = 2, partialWindows = true) assertThat (windowed.sizeTo). assertThat (windowed.first ()). מכיל (1, 2, 3) assertThat (חלון [1]). מכיל (3, 4, 5) assertThat (windowed.last ()). מכיל (5, 6)}

דומה ל chunked () פונקציה, ניתן למפות כל טווח למשהו אחר:

@Test כיף בעת החלת TransformingWindows_thenShouldCreateSlidingWindowsOfElements () {val theList = (1..6) .toList () val חלון = theList.windowed (size = 3, step = 2, partialWindows = true) {it.joinToString (",")} assertThat (windowed.size) .isEqualTo (3) assertThat (windowed.first ()). isEqualTo ("1, 2, 3") assertThat (חלון [1]). isEqualTo ("3, 4, 5") assertThat (חלון .last ()). isEqualTo ("5, 6")}

5. מסקנה

בדקנו את ממשק ה- API של אוספי Kotlin וכמה מהשיטות המעניינות ביותר.

וכמו תמיד, ניתן למצוא את קוד המקור המלא ב- GitHub.


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