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-valuesmap-mapmap-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/walkinto
(defn map-map [f m]
(clojure.walk/walk #(apply f %) identity m) )
Parellel 버전 – 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) )