Prehľad rozhrania Kotlin Collections API

1. Prehľad

V tomto rýchlom návode si predstavíme Kotlinovo API kolekcií a rozoberieme rôzne typy kolekcií v Kotline a niektoré bežné operácie so zbierkami.

2. Zbierka vs. premenlivá zbierka

Najprv sa pozrime na rôzne typy zbierok v Kotline. Uvidíme, ako inicializovať základné typy zbierok.

The Zbierka zatiaľ čo rozhranie podporuje metódy iba na čítanie MutableCollection podpora metód čítania a zápisu.

2.1. Zoznam

Môžeme vytvoriť jednoduché iba na čítanie Zoznam pomocou metódy zoznam() a čítať a písať MutableList použitím mutableListOf ():

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

2.2. Nastaviť

Podobne môžeme vytvoriť iba na čítanie Nastaviť pomocou metódy setOf () a čítať a písať MutableSet použitím mutableSetOf ():

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

2.3. Mapa

Môžeme tiež vytvoriť iba na čítanie Mapa pomocou metódy mapOf () a čítať a písať MutableMap použitím mutableMapOf ():

val theMap = mapOf (1 na „jeden“, 2 na „dva“, 3 na „tri“) val theMutableMap = mutableMapOf (1 na „jeden“, 2 na „dva“, 3 na „tri“)

3. Užitoční operátori

Kotlinovo API zbierok je oveľa bohatšie ako to, ktoré nájdeme v Jave - prichádza so sadou preťažených operátorov.

3.1. „v ” Prevádzkovateľ

Môžeme použiť výraz „x v zbierke”, Ktoré je možné preložiť do zbierka. obsahuje (x):

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

3.2. The “+” Prevádzkovateľ

Element alebo celú kolekciu môžeme pridať do iného pomocou operátora „+“:

@ Testovacia zábava 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. The “-“ Prevádzkovateľ

Podobne môžeme odstrániť prvok alebo viac prvkov pomocou operátora „-“:

@ Testovacia zábava whenExcludeItems_thenRemoved () {val firstList = listOf ("one", "two", "three") val secondList = listOf ("one", "three") val resultList = firstList - secondList assertEquals (1, resultList.size ) assertTrue (resultList.contains ("two"))}

4. Iné metódy

Na záver preskúmame niekoľko bežných metód zberu. Ak by sme v Jave chceli využiť pokročilé metódy, museli by sme ich použiť Prúd API.

V Kotline nájdeme podobné metódy dostupné v API rozhraní Collections.

4.1. Krájanie

Podzoznam môžeme získať od daného Zoznam:

@ Testovacia zábava whenSliceCollection_thenSuccess () {val theList = listOf ("one", "two", "three") val resultList = theList.slice (1..2) assertEquals (2, resultList.size) assertTrue (resultList.contains ( "dva")) }

4.2. Odstraňujú sa

Z a. Môžeme ľahko odstrániť všetky nuly Zoznam:

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

4.3. Filtrovanie

Zbierkové predmety môžeme ľahko filtrovať pomocou filtra(), ktorý funguje podobne ako filter () metóda z Javy Prúd API:

@Test zábava whenFilterNonPositiveValues_thenSuccess () {val theList = listOf (1, 2, -3, -4, 5, -6) val resultList = theList.filter {it> 0} assertEquals (3, resultList.size) assertTrue (resultList. obsahuje (1)) assertFalse (resultList.contains (-4))}

4.4. Klesajúci

Môžeme zahodiť prvých N položiek:

@Test zábava whenDropFirstItems_thenRemoved () {val theList = listOf ("one", "two", "three", "four") val resultList = theList.drop (2) assertEquals (2, resultList.size) assertFalse (resultList.contains ("jeden")) assertFalse (resultList.contains ("dva"))}

Prvých pár položiek môžeme zahodiť, ak spĺňajú danú podmienku:

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

4.5. Zoskupenie

Môžeme zoskupiť prvky:

@Test zábava 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] !!. contains (5))}

4.6. Mapovanie

Všetky prvky môžeme zmapovať pomocou poskytnutej funkcie:

@Test zábava 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])}

Môžeme použiť flatMap () na vyrovnanie vnorených zbierok. Tu konvertujeme Struny do List a vyhnúť sa tomu, aby ste skončili s Zoznam:

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

4.7. Zníženie

Môžeme vystupovať zložiť / zmenšiť prevádzka:

@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. Chunking

Na rozdelenie kolekcie na kúsky danej veľkosti môžeme použiť chunked () metóda:

@Test zábava whenApplyingChunked_thenShouldBreakTheCollection () {val theList = listOf (1, 2, 3, 4, 5) val chunked = theList.chunked (2) assertThat (chunked.size) .isEqualTo (3) assertThat (chunked.first ()) .obsahuje (1, 2) assertThat (chunked [1]). obsahuje (3, 4) assertThat (chunked.last ()). obsahuje (5)}

Pretože zbierka má päť prvkov, kusový (2) volanie metódy vráti dve kolekcie, z ktorých každá má dva prvky a jednu kolekciu s jedným prvkom.

Po rozdelení kolekcie je tiež možné zmapovať každý blok na niečo iné:

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

Po vytvorení blokov veľkosti 3 prevedieme každý blok na reťazec oddelený čiarkami.

4.9. Okná

The okenné () funkcia vráti zoznam rozsahov prvkov presunutím posuvného okna danej veľkosti po kolekcii prvkov.

Aby sme tomu lepšie porozumeli, pozrime sa, ako na to okenné (3) pracuje na zbierke 6 prvkov:

Spočiatku je veľkosť okna 3, preto by prvý zoznam obsahoval 1, 2 a 3. Potom sa posuvné okno posunie o jeden prvok ďalej:

Posuvné okno sa posúva dopredu, kým nevytvorí ďalší zoznam danej veľkosti:

Táto postupnosť prechodov sa v kóde Kotlin prejavuje ako:

@Test zábava whenApplyingWindowed_thenShouldCreateSlidingWindowsOfElements () {val theList = (1..6) .toList () val windowed = theList.windowed (3) assertThat (windowed.size) .isEqualTo (4) assertThat (windowed.first ()) obsahuje (1, 2, 3) assertThat (s oknami [1]). Obsahuje (2, 3, 4) assertThat (s oknami [2]). Obsahuje (3, 4, 5) assertThat (windowed.last ()). Obsahuje ( 4, 5, 6)}

Posuvné okno sa predvolene posúva zakaždým o krok ďalej. Môžeme to samozrejme zmeniť odovzdaním vlastnej hodnoty kroku:

@Test zábava whenApplyingWindowedWithTwoSteps_thenShouldCreateSlidingWindowsOfElements () {val theList = (1..6) .toList () val windowed = theList.windowed (size = 3, step = 2) assertThat (windowed.size) .isEqualhat (2) assertTo (2) first ()). contains (1, 2, 3) assertThat (windowed.last ()). contains (3, 4, 5)}

The okenné () funkcia predvolene vždy a iba vytvára rozsahy danej veľkosti. Aby sme to zmenili, môžeme nastaviť parciálneWindows parameter do pravda:

@Test zábava whenApplyingPartialWindowedWithTwoSteps_thenShouldCreateSlidingWindowsOfElements () {val theList = (1..6) .toList () val windowed = theList.windowed (size = 3, step = 2, partialWindows = true) assertThat (windowed.size) .isEqual assertThat (windowed.first ()) obsahuje (1, 2, 3) assertThat (windowed [1]). obsahuje (3, 4, 5) assertThat (windowed.last ()). obsahuje (5, 6)}

Podobne ako v chunked () je možné namapovať každý rozsah na niečo iné:

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

5. Záver

Preskúmali sme Kotlinovo API zbierok a niektoré z najzaujímavejších metód.

Celý zdrojový kód nájdete ako vždy na serveri GitHub.