我们说我有以下代码:
(def m1 (java.util.HashMap.))
(def m2 (java.util.LinkedHashMap.))
(def m3 {})
我需要一个能够检测来自java的地图的函数,例如:
(map java-map? [m1 m2 m3]) ;; => (true true false)
开箱即用?
答案 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的持久映射。