map-map,map-map-keys和map-map-values
我不知道Clojure中已有此功能,但是这是该功能的实现,因为map-map-values您可以自由复制。它带有两个紧密相关的函数map-map和map-map-keys,这些也是标准库中所缺少的:
(defn map-map
    "Returns a new map with each key-value pair in `m` transformed by `f`. `f` takes the arguments `[key value]` and should return a value castable to a map entry, such as `{transformed-key transformed-value}`."
    [f m]
    (into (empty m) (map #(apply f %) m)) )
(defn map-map-keys [f m]
    (map-map (fn [key value] {(f key) value}) m) )
(defn map-map-values [f m]
    (map-map (fn [key value] {key (f value)}) m) )
用法
您可以这样打电话map-map-values:
(map-map-values str {:a 1 :b 2})
;;           => {:a "1", :b "2"}
而其他两个功能是这样的:
(map-map-keys str {:a 1 :b 2})
;;         => {":a" 1, ":b" 2}
(map-map (fn [k v] {v k}) {:a 1 :b 2})
;;    => {1 :a, 2 :b}
替代实施
如果只需要map-map-keys或map-map-values,而没有更通用的map-map功能,则可以使用以下不依赖的实现map-map:
(defn map-map-keys [f m]
    (into (empty m)
        (for [[key value] m]
            {(f key) value} )))
(defn map-map-values [f m]
    (into (empty m)
        (for [[key value] m]
            {key (f value)} )))
此外,如果您更喜欢此表述,map-map这是基于的替代实现,clojure.walk/walk而不是into:
(defn map-map [f m]
    (clojure.walk/walk #(apply f %) identity m) )
并行版本– pmap-map等
如果需要,这些功能也有并行版本。他们只是使用pmap而不是map。
(defn pmap-map [f m]
    (into (empty m) (pmap #(apply f %) m)) )
(defn pmap-map-keys [f m]
    (pmap-map (fn [key value] {(f key) value}) m) )
(defn pmap-map-values [f m]
    (pmap-map (fn [key value] {key (f value)}) m) )