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.