我有一个函数返回一个包含两个字段的结构:key:event。 :event字段是一个映射(从缓存中检索的分解的Java对象)。在REPL中,我将返回值视为地图。
然后我应用(def events (map #(make-event %) (keys events-cache)))
,从缓存中为每个键应用make-event函数,并希望返回一个包含按键键入的每个事件映射的映射。
我得到的是,但在列表中。所以调用任何map函数,搜索等都会抛出错误, clojure.lang.LazySeq无法强制转换为clojure.lang.IFn 。
我确定我认为这一切都错了,但有没有办法从列表中提取地图?
答案 0 :(得分:7)
也许这就是你想要的?
(into {} (for [k (keys events-cache)]
[k (make-event k)]))
答案 1 :(得分:1)
您的条款含糊不清,您发布的错误消息表明问题与您提出的问题有很大不同。如果你发布一些代码,你可能会得到更多的帮助,而尤其是一个真正的堆栈跟踪。
但一般来说,此错误消息显示“您有一个懒惰的seq对象,您尝试将其作为函数调用”,如:
(let [m1 (map some-function whatever)
m2 (...more stuff...)]
(m1 m2))
如果您想返回两个元素的m1
和m2
列表,而不是调用 m1
以m2
作为参数的函数,您想使用list
函数:
(list m1 m2)
答案 2 :(得分:1)
假设您不关心events-cache
的值是什么,并且您希望最终得到events-cache
关键字的地图,以及make-event
生成的内容你可以这样做:
(def events
(let [event-keys (keys events-cache)]
(zipmap event-keys (map make-event event-keys))))
我不确定为什么你有一个包含值的缓存,但是不使用这些值,但这是另一个问题:)
答案 3 :(得分:1)
只是为了好玩:
(into {} (map (juxt identity make-event) event-keys))