映射clojure地图

时间:2013-06-11 10:10:51

标签: collections map clojure

我一直在尝试使用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)保证keysvals序列的顺序是相互保留的。

另一个想法是:

(map #(pprint (str (first %1) " " (rest %1))) my-map)

与普通%1%2不同,这不是很好。

我相信有更好的方法可以做到这一点。如果你知道的话,请你分享一下吗?提前谢谢!

2 个答案:

答案 0 :(得分:5)

keysvals确实提供相同的订单。

或者,您可以在地图的条目中映射函数:

(map (fn [[k v]] ...) {:foo 1 :bar 2})

或使用reduce-kv

(reduce-kv (fn [_ k v] ...) nil {:foo 1 :bar 2})

答案 1 :(得分:4)

map用于在集合上懒惰地应用函数以生成新集合。当你真正需要最终的集合时,我会使用它。

但在这种情况下,您只是枚举k / v对以解决pprint的副作用,因此请考虑使用doseq代替:

(doseq [[k v] {:hello 1 :world 2}]
  (pprint (str k " " v)))