如何在 Clojure 中映射 PersistentHashMaps 的 PersistentVector?

How to map PersistentVector of PersistentHashMaps in Clojure?

我有一个 PersistentHashMap 的 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 的集合,所以我需要映射一个向量并从每个映射 select id 值。

我愿意:

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

有更好的方法吗?

关键字可以用作函数。

(map :id (all-users))

如果您使用的是 Clojure 1.7 并且不需要懒惰,例如。 G。想要将整个集合实现为矢量,您可以使用地图转换器:

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

除非你知道你需要 map 的惰性行为,否则我总是建议使用 mapv:

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

不同之处在于 mapv 始终立即求值,并将结果填充到向量中以便于访问。惰性序列非常适用于非常大或非常慢的事物,但它们引入了一层额外的时序不确定性,而 99% 的用例都不需要它。