如何区分java地图和clojure地图?

时间:2016-04-14 14:54:51

标签: dictionary clojure clojure-java-interop

我们说我有以下代码:

(def m1 (java.util.HashMap.))
(def m2 (java.util.LinkedHashMap.))
(def m3 {})

我需要一个能够检测来自java的地图的函数,例如:

(map java-map? [m1 m2 m3]) ;; => (true true false)

开箱即用?

2 个答案:

答案 0 :(得分:8)

您可以使用map?来检查是否实现IPersistentMap某些内容对于Clojure地图是否属实,但对于java.utils.*地图却不是这样:

(map? (java.util.HashMap.)) ;; => false
(map? (java.util.LinkedHashMap.)) ;; => false
(map? {}) ;; => true

更确切地说,您应该检查给定对象是否满足某些要求(例如,持久性,不可变/可变 - map?将回答该特定问题)。没有简单的方法可以判断您是否获得了地图的Java实现,因为您可以从外部库中获取任何其他实现,这些实现可能具有java.util.Map的自定义实现,或者从{{1}扩展其中一个具体实现}包。

答案 1 :(得分:4)

我会这样做:

user=> (defn java-map? [m] 
         (and (instance? java.util.Map m) 
              (not (map? m))))
#'user/java-map?

user=> (java-map? {})
false

user=> (java-map? (java.util.HashMap.))
true

user=> (java-map? [])
false

所以你只需检查它是否实现了核心java的Map接口,但不是clojure的持久映射。