我一直在尝试使用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
不同,这不是很好。
我相信有更好的方法可以做到这一点。如果你知道的话,请你分享一下吗?提前谢谢!
答案 0 :(得分:5)
keys
和vals
确实提供相同的订单。
或者,您可以在地图的条目中映射函数:
(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)))