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"}