2011-03-31 45 views
4

我有一個函數返回一個具有兩個字段的結構:key:event。 :event字段是一個映射(從高速緩存檢索到的分解的Java對象)。在REPL中,我將返回值看作地圖。將列表轉換回映射的地圖

然後,我應用(def events (map #(make-event %) (keys events-cache))),對緩存中的每個密鑰應用make-event函數,並且希望映射返回包含通過密鑰鍵入的每個事件映射。

我得到的回覆是如此,但名單內。因此調用任何地圖功能,搜索等,引發錯誤,clojure.lang.LazySeq不能轉換到clojure.lang.IFn

我敢肯定,我在想這都是錯誤的,但有沒有辦法拉從列表地圖的地圖嗎?

+0

這有點難以想像你的意思是這裏的數據 - 這將有助於有什麼'事件,cache'看起來像一個[可能簡化]例如,什麼'讓-event'一樣。它現在看起來像'events-cache'中的值永遠不會用在'events'的輸出中。 – trptcolin 2011-03-31 02:23:35

+0

user>(keys events-cache) (44 29 76 36 26 33 65 25)對於我稱之爲make-event的每個鍵。 make-event返回一個clojure地圖。我想要的是這些地圖的地圖,但我得到的列表包含地圖的地圖。 – JPT 2011-03-31 02:28:47

+0

用戶>事件 ({:鍵44,:事件{:名稱 「S-測試#1」,:狀態 「打開的」,:啓動#<日期星期二06月15十三點27分00秒EDT 2010>,:TV「 「:」體育「足球」,:主場「曼聯足球俱樂部」,:客場「利物浦足球俱樂部」}} {:key 29,:event {:name「Singles Woods v Harrington」,:status「Opened」 <日期3月11日00:00:00東部標準時間2010>,:電視「天空體育」,:體育「高爾夫」,:主頁「老虎伍茲」,:客場「帕德雷格哈靈頓」}})。這是因爲地圖函數返回一個列表? – JPT 2011-03-31 02:36:51

回答

7

也許這就是你想要的?

(into {} (for [k (keys events-cache)] 
      [k (make-event k)])) 
+0

完美。謝謝。其實這也爲我解答了更多的問題。 – JPT 2011-03-31 02:48:58

1

你而言是模糊的,並在發佈的錯誤信息提示的問題是一個非常不同的排序不是你問的問題。如果你發佈了一些代碼,你可能會得到更多的幫助,並且特別是一個真正的堆棧跟蹤。

但在一般情況下,此錯誤消息說「你有你想作爲一個函數來調用一個懶惰的序列對象」,如:

(let [m1 (map some-function whatever) 
     m2 (...more stuff...)] 
    (m1 m2)) 

如果你想兩個元素的m1m2,而不是調用m1m2一個函數作爲一個參數列表,你想使用的功能list

(list m1 m2) 
+0

我期待地圖的地圖,以便我可以使用(事件42)進行搜索並使用鍵42和值獲取地圖。我明白這個錯誤,因爲我沒有地圖。 – JPT 2011-03-31 02:33:56

1

假設你不關心任何的events-cache的值分別爲,並要與地圖的events-cache鑰匙給您make-event生成的東西就結了,你可以這樣做:

(def events 
    (let [event-keys (keys events-cache)] 
    (zipmap event-keys (map make-event event-keys)))) 

我不知道爲什麼你有一個緩存,包括價值觀,但隨後沒有使用這些值,但這是另一個問題:)

+0

緩存(Java Map)有一個Integer鍵和一個Java對象作爲一個值。我只想從對象中提取需要的屬性,並且使用該鍵的Clojure映射以及所需屬性的映射。對不起,這個問題有點含糊。 – JPT 2011-03-31 02:51:24

1

而只是爲了好玩:

(into {} (map (juxt identity make-event) event-keys)) 
+0

確實很有趣。 +1用於使用具有標識的juxt。你從哪裏得到靈感? – 2011-03-31 10:54:28

+0

不知道。我不記得我是否在某處讀過它,或者我是否自己想出了它。我發現這個成語很好。 – kotarak 2011-03-31 12:36:47