Map em Kotlin: Como Funciona?

O map não faz parte da genealogia de collections do kotlin, no entanto ele também é um tipo de collection. Ele basicamente, armazena um par de chaves (key pairs), com uma chave representando o índice e a outra chave representando o valor… Se você imaginou alguma semelhança com um array… tem uma certa semelhança sim, salvo que o map me permite inserir chaves de tipos diferentes, que são chamados de Comparables

Um map aceita que chaves diferentes contenham valores iguais, mas não aceita chaves iguais.

Vamos aos exemplos:

//Opção 01
val mapaA: Map<String, Comparable<*>> = mapOf(Pair("Nome", "Lincoln"), Pair("Idade", 40), Pair("Resultado",true))

//Opção 02
val mapaB: Map<String, Comparable<*>> = mapOf("Nome" to "Lincoln", "Idade" to 40, "Resultado" to true)
println("MAPA A")
println("Nome: ${mapaA["Nome"]}")
println("Idade: ${mapaA["Idade"]}")
println("Resultado: ${mapaA["Resultado"]}")

println()

println("MAPA B")
println("Nome: ${mapaB["Nome"]}")
println("Idade: ${mapaB["Idade"]}")
println("Resultado: ${mapaB["Resultado"]}")
MAPA A
Nome: Lincoln
Idade: 40
Resultado: true

MAPA B
Nome: Lincoln
Idade: 40
Resultado: true

No exemplo 01 eu trago duas formas de usar o map, mas que geram o mesmo resultado.

Perceba que na opção 01 usamos a função Pair(K, V), que recebe como parâmetro uma chave(K) e um valor(V).

Já na Opção 02 usamos o “to” para formar o key pair. Note também, que os resultados para ambas opções serão os mesmos.

Como o Kotlin faz inferência de tipos, não é obrigatório declararmos o tipo de um determinado elemento, no entanto, por questões de visibilidade, podemos torná-los explícitos e isso pode ser feito de forma automática por meio da IDE.

Se você estiver usando o IntelliJ, poderá tornar o tipo de uma variável explícito, acionando as teclas alt + Enter e em seguida escolhendo a opção <Specify Type Explicity>.

No nosso exemplo a cima, eu explicitei os tipos das variáveis para demonstrar como um map se comporta quando usamos Key Pair de tipos diferentes.

Perceba que tanto a variável mapaA quanto a variável mapaB apresentam o seguinte tipo de variável: Map<String, Comparable<*>> , ou seja, ambas as variáveis são do tipo Map contendo uma chave do tipo String com valorese do tipo Comparable<*>, o que denota um Map com valores de tipos diferentes.

Agora veja um exemplo, onde temos um Map de elementos com tipos iguais:

//Opção03
val mapaC: Map<String, String> = mapOf(Pair("Nome", "Lincoln"),  "Sobrenome" to "Gadea")

//Opção04
val mapaD: Map<String, String> = mapOf("Nome" to "Lincoln", Pair("Sobrenome", "Gadea"))
 println("MAPA C")
 println("Nome: ${mapaC["Nome"]}")
 println("Sobrenome: ${mapaC["Sobrenome"]}")

 println()

 println("MAPA D")
 println("Nome: ${mapaD["Nome"]}")
 println("Sobrenome: ${mapaD["Sobrenome"]}")
MAPA C
Nome: Lincoln
Sobrenome: Gadea

MAPA D
Nome: Lincoln
Sobrenome: Gadea

Perceba que como os valores de todos os pares do Map são do mesmo tipo, o kotlin já realiza a inferência de tipos especificando que temos variáveis do tipo Map<String, String>, ou seja, tanto as chaves quanto os valores são String. É possível diversificar os tipos tanto das chaves quanto dos valores e na minha opinião isso trás uma flexibilidade interessante no uso do Map.

Não podemos deixar de notar também, que no exemplo 02 usamos tanto o “Pair(K, V)” quanto o “to” para criar nosso Map, e os resultados apresentados foram os mesmos.

Observação importante: O uso do to para criar os pares do map, devem ser usados com passimônia, pois ele pode interefir na performance de sua implementação.

Share