Clojure 将列表转换回地图地图

Clojure 将列表转换回地图地图,clojure,Clojure,我有一个函数,它返回一个包含两个字段的结构:key:event。:event字段是一个映射(从缓存检索的分解Java对象)。在REPL中,我将返回值视为映射 然后我应用,(def events(map#(make event%)(keys-events-cache)),为缓存中的每个键应用make event函数,并希望返回一个包含由键设置的每个事件映射的映射 我得到的是,但在一个列表中。因此,调用任何映射函数来搜索等都会抛出一个错误,clojure.lang.LazySeq不能转换为cloju

我有一个函数,它返回一个包含两个字段的结构:key:event。:event字段是一个映射(从缓存检索的分解Java对象)。在REPL中,我将返回值视为映射

然后我应用,
(def events(map#(make event%)(keys-events-cache))
,为缓存中的每个键应用make event函数,并希望返回一个包含由键设置的每个事件映射的映射

我得到的是,但在一个列表中。因此,调用任何映射函数来搜索等都会抛出一个错误,clojure.lang.LazySeq不能转换为clojure.lang.IFn


我肯定我想的都是错的,但是有没有办法把地图从列表中拉出来?

你的术语很模糊,你发布的错误消息表明这个问题与你所问的问题有很大不同。如果您发布一些代码,尤其是真正的stacktrace,您可能会得到更多帮助

但通常,此错误消息表示“您有一个尝试作为函数调用的惰性seq对象”,如:

如果要返回一个包含
m1
m2
的两元素列表,而不是将
m1
作为一个函数调用,并将
m2
作为一个参数,则需要使用
list
函数:

(list m1 m2)

也许这就是你想要的

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

假设您不关心
events cache
的值是什么,并且希望最终得到
events cache
键的映射,这些键指向使用
make event
生成的内容,您可以执行以下操作:

(def events
  (let [event-keys (keys events-cache)]
    (zipmap event-keys (map make-event event-keys))))
我不知道为什么你会有一个包含值的缓存,但不使用这些值,但这是另一个问题:)

只是为了好玩:

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

要将此处的数据可视化有点困难-提供一个[可能简化的]示例,说明
events cache
的外观以及
make event
的功能。它现在看起来像是
事件缓存中的值
从未在
事件
.user>(keys events cache)(44 29 76 36 26 33 65 25)的输出中用于我调用的每个键生成事件。make事件返回clojure映射。我想要的是这些地图的地图,但我得到的列表包含地图。用户>事件({:键44,:事件{:名称“S-test#1”,:状态“Opened”,:start#,:tv“,:sport“Soccer”,:home“Manchester United FC”,:ways“Liverpool FC”}{:键29,:事件{:名称“Singles Woods v Harrington”,:status“Opened”,:start#,:tv“Sky Sports”,:Sports“Golf”,:家中“老虎伍兹”,客场“帕德雷格哈林顿”})。这是因为map函数返回一个列表吗?我希望有一个map,这样我就可以使用(events 42)进行搜索,并获得带有键42和值的map。我理解这个错误,因为我没有地图。非常感谢。实际上,这也为我回答了几个问题。缓存(Java映射)有一个整数键和一个Java对象作为值。我只想从对象中提取我需要的属性,并有一个带有键的Clojure映射,以及我所需属性的映射。对不起,这个问题有点模糊。真的很有趣+1用于使用具有标识的juxt。你从哪里得到灵感的?不知道。我不记得是在什么地方读到的,还是我自己想出来的。我觉得这个成语很好。
(into {} (map (juxt identity make-event) event-keys))