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.