2015-05-28 24 views
1

我有PersistentHashMaps的PersistentVector:如何在Clojure中映射PersistentHashMaps的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 s的集合,所以我需要映射在一個向量,並從每個地圖上選擇id值。

我做的:

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

有沒有更好的方式來做到這一點?

+2

通常在Clojure中我們只討論向量和映射,並沒有提到底層類,因爲有幾種持久向量和映射以提高效率。 –

回答

4

關鍵字可以用作功能。

(map :id (all-users)) 

如果你在Clojure 1.7並且不需要懶惰, G。要認識到他們整個集合,你可以使用地圖傳感器矢量:

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

除非你知道你需要地圖的偷懶行爲,我總是建議使用mapv

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

的區別在於mapv總是立即進行評估,並將結果填入矢量以便於訪問。惰性序列對於非常大或非常緩慢的事物來說都非常棒,但它們引入了99%的用例不需要的時間不確定性的附加層。

+0

你的帖子顯示爲「使用'mapv'作爲默認值,這是一個不好的建議IMO,因此我降低了它的效果,同時:隨機訪問,不容易訪問;每步開銷,而不是時間99%stat is way off, mapv'沒有用99%的時間:大型Clojure程序由許多轉換步驟組成,而惰性序列恰好是idiomaitc構建塊,因爲您不想在步驟之間分配新的矢量,特別是當您不知道結果將由您的功能用戶處理。傳感器是您描述的問題的一般解決方案,'mapv'從來就不是一個。 –