2011-03-31 31 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

相关问题