Map

key-value的集合,相当于其他语言的dict或者hash-map。

创建map,键值对之间也可以不加,

(def ages {"Hugo" 23, "Tom" 25})

添加新元素

user=> (assoc ages "Lily" 19)
{"Hugo" 23, "Tom" 25, "Lily" 19}

如果key已经存在了,那旧的value值会被替换掉

user=> (assoc ages "Tom" 10)
{"Hugo" 23, "Tom" 10}

删除元素

user=> (dissoc ages "Tom")
{"Hugo" 23}

通过key访问元素

user=> (get ages "Hugo")
23

可以通过map本身访问

user=> (ages "Tom")
25

值得注意的是如果要用map直接返回值,要确保map不是nil不然报错

user=> (def bad-map nil)
#'user/bad-map
user=> (get bad-map "k")
nil
user=> (bad-map "k")
Execution error (NullPointerException) at user/eval2039 (REPL:1).
null

如果找不到key,返回缺省值

user=> (get ages "Jack" 29)
29
user=> (ages "Jack" 29)
29

检查元素是否存在

user=> (contains? ages "Hugo") ;返回 true or false
true
user=> (find ages "Hugo") ;返回键值对
["Hugo" 23]

获得所有的key

user=> (keys ages)
("Hugo" "Tom")

获得所有的value

user=> (vals ages)
(23 25)

合并map

user=> (def new-ages {"Lily" 19 "Jack" 29})
#'user/new-ages
user=> (merge ages new-ages)
{"Hugo" 23, "Tom" 25, "Lily" 19, "Jack" 29}

如果有需要合并的map中哟重复的元素,那最右边的胜出

user=> (def new-ages2 {"Tom" 19 "Jack" 29}) ; "Tom"是重复元素
#'user/new-ages2
user=> (merge ages new-ages2) ; new-ages2 中的"Tom"得以保留
{"Hugo" 23, "Tom" 19, "Jack" 29}

如果key用keyword来表示,那么可以通过keyword访问元素

user=> (def boy  {:name "Alan" :age 12})
#'user/boy
user=> (get boy :name)   ;; 通过get访问
"Alan"
user=> (boy :name)       ;; map直接访问
"Alan"
user=> (:name boy)       ;; 通过keyword访问
"Alan"

添加或者修改元素

user=> (assoc boy :age 17)           ;; 修改元素值
{:name "Alan", :age 17}
user=> (assoc boy :nickname "dogg")  ;; 添加元素
{:name "Alan", :age 12, :nickname "dogg"}

删除元素

user=> (dissoc boy :age)
{:name "Alan"}