Opérations sur les Map: partie 1

Voici quelques opérations sur les Map.

On voit ici tout l'intérêt des keywords présentés précédemment. En effet, les clés des Map sont généralement des keywords.

get

Une Map peut avoir des clés de tout type, et il est possible de récupérer la valeur d'une clé via la fonction get.

Si la clé est un keyword, il n'est pas nécessaire d'appeler get, on peut directement utiliser le keyword pour récupérer la valeur associée.

Par exemple, les codes suivant sont équivalents (et retourneront comme résultat 1:

(get {:foo 1} :foo)
(:foo {:foo 1})

Vu que la clé foo est un keyword, il est possible d'utiliser cette clé comme une fonction et de se passer de get.

Il est possible de spécifier une valeur par défaut à retourner si la clé n'existe pas. Sinon, nilsera retourné.

(get {:foo 1} :bar 2)
(:bar {:foo 1} 2)

Les deux expressions précédentes retourneront 2 car la clé bar n'existe pas dans la map.

update

La fonction update est intéressante, elle prend comme paramètre une map, une clé, et une fonction à un argument. Cette fonction sera appelée avec comme paramètre la valeur associée à la clé, et le résultat sera associé dans la map à la clé.

(update {:foo 1} :foo inc)

Ce code appliquera à la valeur associée à la clé foo la fonction inc. La valeur retournée sera donc {:foo 2}.

La fonction peut aussi être utilisée d'une autre façon:

(update {:foo 1} :foo + 10 100)

On voit que l'on ne passe pas en dernier paramètre une fonction. Ici, ce code appellera + comme cela : (+ 1 10 100), 1 étant la valeur de :foo.

On passe donc la valeur à mettre à jour et les autres paramètre de update à la fonction +.

contains?

La fonction contains? permet de tester si une clé est présente dans une map. Rien de bien compliqué ici ;)

Précédent - Suivant -

;; add value(s)
(println (assoc {:foo "foo"} :bar "bar"))
(println (assoc {:foo "foo"} :bar "bar" :baz "baz") "\n")

;; remove value(s)
(println (dissoc {:foo "foo" :bar "bar"} :foo))
(println (dissoc {:foo "foo" :bar "bar"} :foo :bar) "\n")

;; get value
(println (get {:foo "foo"} :foo))
;; if the key is a keyword, you can use the keyword as a function to get the value
(println (:foo {:foo "foo"}))
;; the key does not exists, returns nil
(println (:bar {:foo "foo"}))
;; provide a default value if the key does not exists (work with get too)
(println (:bar {:foo "foo"} "default value!") "\n")

;; update value
(println (update {:foo 1} :foo inc) "\n")

;; test if the map contains the key
(println (contains? {:foo 1} :foo))

powered by mcorbin - Available on Github