在Clojure中使用Java哈希图

时间:2019-01-05 19:04:16

标签: clojure clojure-java-interop

我是Clojure的新手。我试图在clojure中使用Java hashmap。我正在将Java哈希映射传递给Clojure。该地图是-{0 =果阿,1 =德里,2 =孟买}。当我尝试在此地图上使用clojure函数时,没有得到预期的输出。与此相反,当我遍历此地图时,它给出了预期的输出。

Example
   (println(get map 0)) is giving nil




(doseq [[key value] map
      (println value)) is giving the expected output.

        Output-Goa
               Delhi
               Mumbai

有人可以请我解释为什么会这样吗?

3 个答案:

答案 0 :(得分:1)

您真的应该在Google上找到一些类似的已有答案:Clojure: working with a java.util.HashMap in an idiomatic Clojure fashion

然后您将看到一个简单的答案:

(def data {:a 1 :b 2 :c 3})

(def java-map (java.util.HashMap. data))
(def clj-map  (into {} java-map))

这给了我们

java-map  => <#java.util.HashMap {:b 2, :c 3, :a 1}>
clj-map   => <#clojure.lang.PersistentArrayMap {:b 2, :c 3, :a 1}>

并循环:

  (doseq [[k v] clj-map]
    (println (format "key=%s  val=%s" k v)) )

结果:

key=:b  val=2
key=:c  val=3
key=:a  val=1

答案 1 :(得分:0)

我认为您的问题是您的地图被命名为“地图”,这也是Clojure函数。像这样尝试:

addApps (state, payload) {
  state.apps = payload
}

然后它将像这样工作:

state: () => ({
  apps: [],
  query: '',
  loading: false,
  filters: [],
  loadLimit: 25,
  page: 1,
  showFilters: true,
  currentUser: null,
  showLoginModal: false,
  showCreateAppModal: false
})

请注意,它仍然返回nil,因为(println)表单之后没有其他内容,但是它确实在映射中打印了0的值,即“ Goa”。

答案 2 :(得分:0)

(def input-map {0 "Goa" 1 "Delhi" 2 "Mumbai"})

(map (fn[[k v]] (print "key " k " value " k)) input-map) 

[[k v]]功能允许您访问每个条目的键和值

(map print input-map)

这里的地图条目将作为打印参数传递