将列表转换回地图地图

时间:2011-03-31 02:04:05

标签: clojure

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

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

我得到的是,但在列表中。所以调用任何map函数,搜索等都会抛出错误, clojure.lang.LazySeq无法强制转换为clojure.lang.IFn

我确定我认为这一切都错了,但有没有办法从列表中提取地图?

4 个答案:

答案 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))

如果您想返回两个元素的m1m2列表,而不是调用 m1m2作为参数的函数,您想使用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))