如何在Clojure中映射PersistentHashMaps的PersistentVector?

时间:2015-05-28 12:03:50

标签: clojure functional-programming

我有PersistentHectorMaps的PersistentVector:

[
  {:url http://www.url.com, id: some_id ...},
  {:url http://www.url.com, id: some_id ...},
  {:url http://www.url.com, id: some_id ...},
]

我需要这里有一个所有id的集合,所以我需要映射一个向量,并从每个地图中选择id值。

我做:

(map #(get % :id) (all-users))

有更好的方法吗?

2 个答案:

答案 0 :(得分:4)

关键字可以用作功能。

(map :id (all-users))

如果你在Clojure 1.7上并且不需要懒惰,e。 G。想要将整个集合实现为矢量,你可以使用地图传感器:

(into [] (map :id) (all-users))

答案 1 :(得分:1)

除非你知道你需要地图的懒惰行为,否则我总是建议使用mapv

(def all-users [ {:id 111 ...} 
                 {:id 222 ...}
                 ... ] )
(mapv :id all-users)

不同之处在于mapv总是立即进行评估,并将结果填入矢量以便于访问。懒惰序列非常适用于非常大或非常慢的事情,但是它们引入了额外的时序不确定性层,99%的用例都不需要它。