Introducció
Un Map és un conjunt de parelles clau-valor, en què es pot accedir a un valor a partir de la seva clau.
Recuperar claus i valors
A continuació tens un mapa immutable amb 3 parells clau-valor:
val pets = mapOf(1 to "Toby", 4 to "Garfield", 7 to "Snoopy")Per recuperar un valor d’un mapa has de proporcionar la seva clau amb [] (o la funció get()).
require(pets[4] == "Garfield")Si no es troba la clau donada, retorna null.
require(pets[2] == null)Per gestionar claus inexistents, pots utilitzar un valor per defecte:
require(pets.getOrDefault(2, "No pet") == "No pet")O executar una funció que retorni un valor per defecte:
require(pets.getOrElse(2) { "no pet".uppercase() } == "NO PET")Per efectuar operacions sobre totes les claus o tots els valors d’un mapa, pots recuperar-los de les propietats keys i values respectivament.
keysés un conjunt de totes les claus del mapavaluesés una col·lecció de tots els valors del mapa.
A continuació tens un map amb 3 telefons:
val phoneBook = mapOf( "Raquel" to 629510476, "Joan" to 670434123, "Laura" to 621987345)Quin és el telèfon de “Laura”?
phoneBook["Laura"]Operacions d’escriptura
Els mapes mutables ofereixen operacions d’escriptura específiques per a mapes.
Aquestes operacions permeten canviar el contingut del mapa utilitzant l’accés basat en claus als valors.
Hi ha certes regles que defineixen les operacions d’escriptura en mapes:
-
Els valors es poden actualitzar.
-
Les claus mai canvien: una vegada afegeixes una entrada, la seva clau és constant.
-
Per a cada clau, sempre hi ha un únic valor associat amb ella.
-
Pots afegir i eliminar entrades completes.
Afegir i actualitzar entrades
Per afegir un nou parell clau-valor a un mapa mutable, utilitza [] (o put()).
require(pets[2] == null)
pets[2] = "Dumbo"require(pets[2] == "Dumbo")També pots utilitzar la sintaxis +=:
require(pets[2] == null)
pets += 2 to "Dumbo"require(pets[2] == "Dumbo")Quan es crida amb una clau present al mapa, els operadors sobreescriuen els valors de les entrades corresponents.
pets[3] = "Milú"pets[3] = "Lassie"
require(pets[3] == "Lassie")Eliminar entrades
Per eliminar una entrada d’un mapa mutable, utilitza -= (o remove())
pets[3] = "Milú"pets -= 3
require(pets[3] == null)Exemples
Cistella de la compra
Aquí tens un exemple de com podeu utilitzar un mapa per emmagatzemar preus de productes i després calcular el cost total d’una cistella de la compra:
val productPrices = mapOf("Milk" to 1.99, "Bread" to 2.49, "Apple" to 0.35)
val cart = listOf("Milk", "Apple", "Milk", "Bread")val totalCost = cart.sumByDouble { product -> productPrices[product] ?: 0.0 }
println("Total cost: $totalCost")En aquest programa Kotlin,
productPricesés un mapa de només lectura que conté productes com a claus i els seus preus com a valors.- La llista cart representa els articles d’una cistella de la compra.
A continuació, calculem el totalCost iterant sobre la cistella i sumant els preus dels productes. L’operador ?: s’utilitza per gestionar els casos on un producte podria no existir al mapa, assignant-li un valor per defecte de 0.0
Suposem que vols agrupar una llista de persones per la seva edat:
data class Person(val name: String, val age: Int)
fun main() { val people = listOf(Person("Alice", 29), Person("Bob", 29), Person("Charlie", 25)) val peopleByAge: Map<Int, List<Person>> = people.groupBy { it.age }
require(peopleByAge[29] == listOf(Person("Alice", 29), Person("Bob", 29)))}L’ús de la funció groupBy retorna un nou mapa on cada clau és una edat, i el valor és una llista de tots els objectes Person amb aquella edat.
Aquest és un mètode eficient per classificar ràpidament les teves dades basant-te en certs atributs.