我一直在尝试使用Clojure中的map
函数,并且想知道将map
应用于map
集合的最佳实践是什么,以便:
(map #(pprint (str %1 " " %2)) {:hello 1 :world 2})
输出(顺序现在不重要了):
:hello 1
:world 2
我第一个想法是:
(def my-map {:hello 1 :world 2})
(map #(pprint (str %1 " " %2)) (keys my-map) (vals my-map))
但是!我在文档中没有发现任何证据表明Clojure(或ClojureScript)保证keys
和vals
序列的顺序是相互保留的。
(map #(pprint (str (first %1) " " (rest %1))) my-map)
这不是那么好,因为它将与普通%1
和%2
。
keys
和vals
给出相同的顺序。
或者,您可以跨映射的条目映射函数:
(map (fn [[k v]] ...) {:foo 1 :bar 2})
或者使用reduce-kv
:
(reduce-kv (fn [_ k v] ...) nil {:foo 1 :bar 2})
map
用于惰性地在集合上应用函数以生成新集合。当您真正需要结果集合时,我会使用它。
但是在这种情况下,你只是为了pprint
的副作用而枚举k/v对,所以考虑使用doseq
来代替:
(doseq [[k v] {:hello 1 :world 2}]
(pprint (str k " " v)))