A Kotlin Collections API áttekintése

1. Áttekintés

Ebben a gyors bemutatóban bemutatjuk a Kotlin Gyűjtemények API-t, és megbeszéljük a különböző gyűjteményes típusokat Kotlinban, valamint néhány általános műveletet a gyűjteményekkel kapcsolatban.

2. Gyűjtemény vs. megváltoztatható gyűjtemény

Először vessünk egy pillantást a Kotlin különböző gyűjteményeire. Meglátjuk, hogyan lehet inicializálni a gyűjtemények alaptípusait.

A Gyűjtemény interfész támogatja a csak olvasható módszereket MutableCollection támogatja az olvasási / írási módszereket.

2.1. Lista

Készíthetünk egy egyszerű, csak olvashatót Lista módszer segítségével listája() és olvasni-írni MutableList felhasználásával mutableListOf ():

val theList = listOf ("egy", "kettő", "három") val theMutableList = mutableListOf ("egy", "kettő", "három")

2.2. Készlet

Hasonlóképpen létrehozhatunk csak olvashatót is Készlet módszer segítségével készlet() és olvasni-írni MutableSet felhasználásával mutableSetOf ():

val theSet = setOf ("egy", "kettő", "három") val theMutableSet = mutableSetOf ("egy", "kettő", "három")

2.3. Térkép

Létrehozhatunk csak olvashatót is Térkép módszer segítségével mapOf () és olvasni-írni MutableMap felhasználásával mutableMapOf ():

val theMap = mapOf (1 - "egy", 2 - "kettő", 3 - "három") val theMutableMap = mutableMapOf (1 - "egy", 2 - "kettő", 3 - "három")

3. Hasznos üzemeltetők

A Kotlin Gyűjtemények API-ja sokkal gazdagabb, mint amit a Java-ban találunk - túlterhelt operátorokkal rendelkezik.

3.1. A "ban ben" Operátor

Használhatjuk a következő kifejezést:x a gyűjteményben”Fordítható collection.contains (x):

@Test fun whenSearchForExistingItem_thenFound () {val theList = listOf ("egy", "kettő", "három") assertTrue ("kettő" a listában)}

3.2. A “+” Operátor

Elemeket vagy teljes gyűjteményeket átadhatunk egy másiknak a „+” operátor használatával:

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

3.3. A “-“ Operátor

Hasonlóképpen eltávolíthatunk egy elemet vagy több elemet a „-” operátor használatával:

@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 ("kettő"))}}

4. Egyéb módszerek

Végül feltárunk néhány általános módszert a gyűjtésre. A Java-ban, ha fejlett módszereket akarunk kihasználni, akkor használnunk kell Folyam API.

Kotlinban hasonló módszereket találhatunk a Collections API-ban.

4.1. Szeletelés

Adottaktól kaphatunk allistát Lista:

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

4.2. Eltávolítás

Könnyen eltávolíthatjuk az összes nullát az a-ból Lista:

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

4.3. Szűrő

A gyűjtemény segítségével könnyen szűrhetjük a szűrőt(), amely hasonlóan működik a szűrő() módszer a Java-ból Folyam 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. tartalmazza (1)) assertFalse (resultList.contains (-4))}

4.4. Csepegés

Dobhatjuk az első N elemet:

@Test fun whenDropFirstItems_thenRemoved () {val theList = listOf ("one", "two", "three", "four") val resultList = theList.drop (2) assertEquals (2, resultList.size) assertFalse (resultList.contains ("egy")) assertFalse (resultList.contains ("kettő"))}}

Az első néhány elemet eldobhatjuk, ha megfelelnek az adott feltételnek:

@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 ("egy")) assertFalse (resultList.contains ("kettő"))}

4.5. Csoportosítás

Csoportosíthatjuk az elemeket:

@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]! !. tartalmaz (1)) assertTrue (eredménytérkép [2] !!. tartalmazza (5))}

4.6. Térképezés

Minden elemet feltérképezhetünk a megadott függvény segítségével:

@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])}

Tudjuk használni flatMap () beágyazott gyűjtemények ellapítására. Itt konvertálunk Húrok hogy List és kerülve a végét Lista:

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

4.7. Csökkentés

Előadhatunk hajtogat / csökkent művelet:

@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. Dobogó

Ha egy gyűjteményt adott méretű darabokra akarunk bontani, használhatjuk a darabos () módszer:

@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 () .contains (1, 2) assertThat (darabos [1]). tartalmaz (3, 4) assertThat (chunked.last ()). tartalmaz (5)}

Mivel a gyűjtemény öt elemből áll, a darabos (2) A method hívás két gyűjteményt ad vissza két-két elemmel és egy egyelemes gyűjteményt.

A gyűjtemény felbomlása után minden darabot máshoz is lehet hozzárendelni:

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

A 3. méretű darabok létrehozása után mindegyik darabot vesszővel elválasztott karakterlánccá alakítjuk.

4.9. Ablakozás

A ablakos() A function egy elemtartomány-listát ad vissza, egy adott méretű csúszó ablakot áthelyezve az elemek gyűjteményére.

Ennek jobb megértése érdekében nézzük meg, hogyan ablakos (3) 6 elemből álló gyűjteményen dolgozik:

Eleinte az ablak mérete 3, ezért az első lista 1, 2 és 3-at tartalmazna. Ezután a csúszó ablak egy elemet tovább visz:

A csúszó ablak addig mozog előre, amíg nem sikerül létrehozni a megadott méretű újabb listát:

Ez az átmenetsorozat a Kotlin-kódban a következőképpen nyilvánul meg:

@Test fun whenApplyingWindowed_thenShouldCreateSlidingWindowsOfElements () {val theList = (1..6) .toList () val windowed = theList.windown (3) assertThat (windowed.size) .isEqualTo (4) assertThat (windowed.first ()). (1, 2, 3) assertThat (ablakos [1]). Tartalmaz (2, 3, 4) assertThat (ablakos [2]). Tartalmaz (3, 4, 5) assertThat (windowed.last ()). Tartalmaz ( 4, 5, 6)}

Alapértelmezés szerint a csúszó ablak minden alkalommal egy lépéssel tovább mozog. Természetesen ezen változtathatunk egy egyedi lépésérték átadásával:

@Test fun whenApplyingWindownWithTwoSteps_thenShouldCreateSlidingWindowsOfElements () {val theList = (1..6) .toList () val windowed = theList.windowed (size = 3, step = 2) assertThat (windowed.size) .isEqualThat (2 window). first ()). tartalmaz (1, 2, 3) assertThat (windowed.last ()). tartalmazza (3, 4, 5)}

A ablakos() A function alapértelmezés szerint mindig és csak az adott méretű tartományokat hozza létre. Ennek megváltoztatásához beállíthatjuk a részleges Windows paraméter a igaz:

@Test fun whenApplyingPartialWindowedWithTwoSteps_thenShouldCreateSlidingWindowsOfElements () {val theList = (1..6) .toList () val windowed = theList.windown (size = 3, step = 2, particWindows = true) assertThat (windowed.size). assertThat (windowed.first ()). tartalmaz (1, 2, 3) assertThat (windowed [1]). tartalmaz (3, 4, 5) assertThat (windowed.last ()). tartalmazza (5, 6)}

Hasonló a darabos () függvény, az egyes tartományokat másra lehet leképezni:

@Test fun whenApplyingTransformingWindows_thenShouldCreateSlidingWindowsOfElements () {val theList = (1..6) .toList () val windowed = theList.windown (size = 3, step = 2, partsWindows = true) {it.joinToString (",")} assertThat (windowed.size) .isEqualTo (3) assertThat (windowed.first ()). isEqualTo ("1, 2, 3") assertThat (ablakos [1]). isEqualTo ("3, 4, 5") assertThat (ablakos) .last ()). isEqualTo ("5, 6")}

5. Következtetés

Felfedeztük a Kotlin Collections API-t és a legérdekesebb módszereket.

És mint mindig, a teljes forráskód megtalálható a GitHubon.