Konvertere en liste til kart i Kotlin

1. Introduksjon

I denne raske opplæringen vil vi se hvordan vi kan konvertere en Liste til en Kart Jegn Kotlin.

2. Implementering

Kotlin tilbyr det praktiske å kartlegge metode som, gitt en liste over komplekse objekter, vil tillate oss å ha elementer i listen vår kartlagt av alle verdier vi gir:

val user1 = User ("John", 18, listOf ("Hiking")) val user2 = User ("Sara", 25, listOf ("Chess")) val user3 = User ("Dave", 34, listOf (" Spill ")) @Test fun givenList_whenConvertToMap_thenResult () {val myList = listOf (user1, user2, user3) val myMap = myList.map {it.name to it.age} .toMap () assertTrue (myMap.get (" John " ) == 18)}

Husk det "til" nøkkelord blir brukt her for å lage par med navn og alder. Denne metoden skal returnere et kart som bevarer oppføringsrekkefølgen til elementene i matrisen:

{John = 18, Sara = 25, Dave = 34}

Det samme ville skje når vi kartlegger et mindre utvalg av String:

@Test fun givenStringList_whenConvertToMap_thenResult () {val myList = listOf ("a", "b", "c") val myMap = myList.map {it to it} .toMap () assertTrue (myMap.get ("a") = = "a")}

Den eneste forskjellen er at vi ikke spesifiserer verdien for den siden det bare vil bli kartlagt av det.

Så som et andre alternativ for å konvertere en Liste til en Kart er ved å bruke assosiert av metode:

@Test fun givenList_whenAssociatedBy_thenResult () {val myList = listOf (user1, user2, user3) val myMap = myList.associateBy ({it.name}, {it.hobbies}) assertTrue (myMap.get ("John") !!. inneholder ("Vandring"))}

Vi endret testen slik at den bruker en matrise som verdien:

{John = [Vandring, Svømming], Sara = [Sjakk, Brettspill], Dave = [Spill, Racingsport]}

3. Hvilken skal du bruke?

Hvis begge metodene i hovedsak oppnår den samme funksjonaliteten, hvilken skal vi bruke?

å kartlegge, når det gjelder implementering, er mer intuitivt. Imidlertid krever bruk av denne metoden oss å transformere vår Array inn i Par først, som senere må oversettes til vår Kart, så denne operasjonen vil være spesielt nyttig hvis vi allerede bruker samlinger av Par.

For samlinger av andre typer, forbinder API vil være det beste valget.

4. Kartlegging ved hjelp forbinder* Metoder

I vårt forrige eksempel brukte vi associateBy metoden, men Kotlin samlinger pakken har forskjellige versjoner for forskjellige brukstilfeller.

4.1. De forbinder() Metode

Vi begynner med å bruke forbinder metode - som ganske enkelt returnerer a Kart ved å bruke en transformeringsfunksjon på elementene i matrisen:

@Test fun givenStringList_whenAssociate_thenResult () {val myList = listOf ("a", "b", "c", "d") val myMap = myList.associate {it to it} assertTrue (myMap.get ("a") = = "a")}

4.2. De knytte til Metode

Ved hjelp av denne metoden kan vi samle elementene våre på et allerede eksisterende kart:

@Test fun givenStringList_whenAssociateTo_thenResult () {val myList = listOf ("a", "b", "c", "c", "b") val myMap = mutableMapOf () myList.associateTo (myMap) {it to it} assertTrue (myMap.get ("a") == "a")}

Det er viktig å huske å bruke den mutable Kart - dette eksemplet fungerer ikke med en uforanderlig.

4.3. De associateByTo Metode

De associateByTo gir oss mest fleksibilitet av de tre siden vi enten kan passere kartet som vil bli fylt ut, a keySelector funksjon. For hver spesifiserte nøkkel vil den tilknyttede verdien være objektet der nøkkelen ble hentet fra:

@Test fun givenStringList_whenAssociateByToUser_thenResult () {val myList = listOf (user1, user2, user3, user4) val myMap = mutableMapOf () myList.associateByTo (myMap) {it.name} assertTrue (myMap.get. !!) alder == 34)}

Eller vi kan bruke en verdiTransform funksjon:

@Test fun givenStringList_whenAssociateByTo_thenResult () {val myList = listOf (user1, user2, user3, user4) val myMap = mutableMapOf () myList.associateByTo (myMap, {it.name}, {it.age}) assertTrue (my "Dave") == 34)}

Det er viktig å huske det hvis nøkkelkollisjoner skjer, beholdes bare den siste merverdien.

5. Konklusjon

I denne artikkelen undersøkte vi forskjellige måter å konvertere en Liste til en Kart i Kotlin.

Som alltid kan implementeringen av alle disse eksemplene og utdragene finnes på GitHub.


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