Les maps sont une structure de données qui contient des paires clé-valeur.
Les clés peuvent être de n'importe quel type, mais doivent être uniques.
Les valeurs peuvent être de n'importe quel type, elles n'ont pas besoin d'être uniques.
Les maps ne garantissent pas l'ordre de leur contenu, bien qu'elles semblent le faire.
Les maps peuvent être déclarées avec une forme littérale :
# An empty map
%{}
# A map with the atom key :a associated to the integer value 1
%{a: 1}
# A map with the string key "a" associated to the float value 2.0
%{"a" => 2.0}
# A map with the map key %{} with the list value [1 ,2, 3]
%{%{} => [1, 2, 3]}
# A map with keys of different types
%{:a => 1, "b" => 2}
Les maps peuvent aussi être instanciées avec Map.new du module Map. C'est utile si tu as déjà une collection énumérable à transformer en map :
kw_list = [a: 1, b: 2]
Map.new(kw_list)
# => %{a: 1, b: 2}
On peut accéder aux valeurs d'une map de plusieurs façons différentes :
my_map = %{key: "value"}
# with a dot if the key is an atom
my_map.key
# => "value"
# with [], a syntax provided by the Access behaviour
my_map[:key]
# => "value"
# with pattern matching
%{key: x} = my_map
x
# => "value"
# with Map.get/2
Map.get(my_map, :key)
# => "value"
Le module Map, fourni avec la bibliothèque standard, propose de nombreuses fonctions utiles pour manipuler les maps.
Map.delete(%{a: 2, b: 3}, :a)
# => %{b: 3}
Les maps implémentent le protocole Enumerable, ce qui permet d'utiliser les fonctions du module Enum.
Les fonctions anonymes ou les références à des fonctions capturées sont souvent nécessaires comme arguments des fonctions de Map et du module Enum
# Increment the value by one, if it is not found, update it with 0
Map.update(%{a: 1}, :a, 0, &(&1 + 1))
# => %{a: 2}
# Sorting by a specific sub-value
list = [{"A", 4}, {"B", 3}, {"C", 2}, {"D", 1}]
Enum.sort_by(list, &Kernel.elem(&1, 1))
# => [{"D", 1}, {"C", 2}, {"B", 3}, {"A", 4}]