Pregled API-ja Kotlin Collections

1. Pregled

U ovom brzom vodiču predstavit ćemo Kotlin's Collections API i razgovarat ćemo o različitim vrstama kolekcija u Kotlinu i nekim uobičajenim operacijama nad kolekcijama.

2. Zbirka vs. Promjenjiva zbirka

Prvo, pogledajmo različite vrste kolekcija u Kotlinu. Vidjet ćemo kako se inicijaliziraju osnovne vrste zbirki.

The Kolekcija sučelje podržava metode samo za čitanje dok Promjenjiva kolekcija podržati metode čitanja / pisanja.

2.1. Popis

Možemo stvoriti jednostavno čitanje Popis koristeći metodu popis() i čitati-pisati Promjenjiva lista koristeći mutableListOf ():

val theList = listOf ("jedan", "dva", "tri") val theMutableList = mutableListOf ("jedan", "dva", "tri")

2.2. Postavi

Slično tome možemo stvoriti samo za čitanje Postavi koristeći metodu setOf () i čitati-pisati MutableSet koristeći mutableSetOf ():

val theSet = setOf ("jedan", "dva", "tri") val theMutableSet = mutableSetOf ("jedan", "dva", "tri")

2.3. Karta

Također možemo stvoriti samo za čitanje Karta koristeći metodu mapOf () i čitati-pisati Promjenjiva karta koristeći mutableMapOf ():

val theMap = mapOf (1 na "jedan", 2 na "dva", 3 na "tri") val theMutableMap = mutableMapOf (1 na "jedan", 2 na "dva", 3 na "tri")

3. Korisni operateri

Kotlinov API za zbirke mnogo je bogatiji od onog koji možemo pronaći na Javi - dolazi s nizom preopterećenih operatora.

3.1. "u" Operater

Možemo upotrijebiti izraz „x u kolekciji”Koji se može prevesti na zbirka.sadrži (x):

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

3.2. The “+” Operater

Element ili cijelu kolekciju možemo dodati drugom pomoću operatora “+”:

@Test zabave 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 ("pet"))}

3.3. The “-“ Operater

Slično tome, možemo ukloniti element ili više elemenata pomoću operatora "-":

@Test zabave 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. Ostale metode

Na kraju ćemo istražiti neke uobičajene metode prikupljanja. U Javi bismo, ako bismo htjeli iskoristiti napredne metode, morali koristiti Stream API.

U Kotlinu možemo pronaći slične metode dostupne u API-ju za zbirke.

4.1. Rezanje

Možemo dobiti sublist od datog Popis:

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

4.2. Uklanjanje

Jednostavno možemo ukloniti sve nule iz a Popis:

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

4.3. Filtriranje

Pomoću filtra stavke kolekcije možemo jednostavno filtrirati(), koji radi slično kao filtar() metoda s Jave Stream API:

@Test zabave whenFilterNonPositiveValues_thenSuccess () {val theList = listOf (1, 2, -3, -4, 5, -6) val resultList = theList.filter {it> 0} assertEquals (3, resultList.size) assertTrue (resultList. sadrži (1)) assertFalse (resultList.contens (-4))}

4.4. Ispuštanje

Možemo ispustiti prvih N stavki:

@Test zabave whenDropFirstItems_thenRemoved () {val theList = listOf ("one", "two", "three", "four") val resultList = theList.drop (2) assertEquals (2, resultList.size) assertFalse (resultList.contens ("jedan")) assertFalse (resultList.contens ("two"))}

Nekoliko prvih predmeta možemo ispustiti ako zadovoljavaju zadani uvjet:

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

4.5. Grupiranje

Elemente možemo grupirati:

@Test zabave whenGroupItems_thenSuccess () {val theList = listOf (1, 2, 3, 4, 5, 6) val resultMap = theList.groupBy {it% 3} assertEquals (3, resultMap.size) assertTrue (resultMap [1]! ! .sadrži (1)) assertTrue (resultMap [2] !!. sadrži (5))}

4.6. Mapiranje

Sve elemente možemo mapirati pomoću predviđene funkcije:

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

Možemo koristiti flatMap () izravnati ugniježđene zbirke. Evo, pretvaramo Žice do List i izbjegavajući završiti s Popis:

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

4.7. Smanjenje

Možemo nastupiti preklopiti / smanjiti operacija:

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

4.8. Komadanje

Da bismo zbirku razlomili na dijelove zadane veličine, možemo koristiti komadano () metoda:

@Test zabave whenApplyingChunked_thenShouldBreakTheCollection () {val theList = listOf (1, 2, 3, 4, 5) val chunked = theList.chunked (2) assertThat (chunked.size) .isEqualTo (3) assertThat (chunked.first) .contens (1, 2) assertThat (chunked [1]). contains (3, 4) assertThat (chunked.last ()). contains (5)}

Budući da zbirka ima pet elemenata, podijeljeno (2) poziv metode vraća dvije zbirke s po dva elementa i jednu kolekciju s jednim elementom.

Također je moguće mapiranje svakog dijela u nešto drugo nakon razbijanja zbirke:

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

Nakon stvaranja dijelova veličine 3, svaki komad pretvaramo u niz odvojen zarezom.

4.9. Prozor

The s prozorom () funkcija vraća popis raspona elemenata pomicanjem kliznog prozora zadane veličine preko kolekcije elemenata.

Da bismo to bolje razumjeli, pogledajmo kako s prozorima (3) radi na zbirci od 6 elemenata:

Prvo je veličina prozora 3, stoga bi prvi popis sadržavao 1, 2 i 3. Zatim se klizni prozor pomiče za jedan element dalje:

Klizni prozor pomiče se naprijed dok ne uspije stvoriti novi popis zadane veličine:

Ovaj se slijed prijelaza u Kotlinovom kodu očituje kao:

@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 (windowed [1]). Contains (2, 3, 4) assertThat (windowed [2]). Contains (3, 4, 5) assertThat (windowed.last ()). Contains ( 4, 5, 6)}

Prema zadanim postavkama, klizni se prozor svaki put pomakne za korak dalje. To, naravno, možemo promijeniti dodavanjem prilagođene vrijednosti koraka:

@Test fun whenApplyingWindowedWithTwoSteps_thenShouldCreateSlidingWindowsOfElements () {val theList = (1..6) .toList () val windowed = theList.windowed (size = 3, step = 2) assertThat (windowed.size) .isEqualTo (2) assert. first ()). contains (1, 2, 3) assertThat (windowed.last ()). contains (3, 4, 5)}

The s prozorom () funkcija, prema zadanim postavkama, uvijek i samo stvara raspone zadane veličine. Da bismo to promijenili, možemo postaviti djelomičniWindows parametar do pravi:

@Test fun whenApplyingPartialWindowedWithTwoSteps_thenShouldCreateSlidingWindowsOfElements () {val theList = (1..6) .toList () val windowed = theList.windowed (size = 3, step = 2, djelomičniWindows = true) assertThat (windowed.sialTois). assertThat (windowed.first ()). contains (1, 2, 3) assertThat (windowed [1]). contains (3, 4, 5) assertThat (windowed.last ()). contains (5, 6)}

Slično kao komadano () funkcija, moguće je preslikati svaki raspon u nešto drugo:

@Test fun whenApplyingTransformingWindows_thenShouldCreateSlidingWindowsOfElements () {val theList = (1..6) .toList () val windowed = theList.windowed (size = 3, step = 2, djelomičniWindows = 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. Zaključak

Istražili smo Kotlinov API za zbirke i neke od najzanimljivijih metoda.

Kao i uvijek, puni izvorni kod možete pronaći na GitHubu.


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