2016-04-14 36 views
4

比方說,我有以下代碼:如何從clojure地圖區分java地圖?

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

我需要的功能,讓我發現,從Java出現的地圖,例如:

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

任何開箱?

+0

您是否嘗試過使用'type'? – jmargolisvt

回答

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的持久地圖。

+0

發送這似乎對我來說是合法的。 – OlegTheCat

8

您可以使用map?來檢查,如果事情實現IPersistentMap這對於Clojure的地圖是真實的,但不是java.utils.*地圖:

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

更準確地說,你倒是應該檢查是否一個給定對象滿足某些要求(例如,是持久的,不變的/可變的 - map?將回答那個具體問題)。沒有簡單的方法可以告訴您是否獲得了Java映射的實現,因爲您可以從外部庫獲得任何其他實現,這些實現可能具有java.util.Map的自定義實現或者從java.util包擴展具體實現之一。

+1

是的,實際上是考慮使用'map?',但是'(def java-map?(補充圖?))' - 這會給其他類型的對象造成不正確的結果:'(java-map?[] );; => true' – OlegTheCat

+1

是的,你是對的,讓我刪除那部分答案,因爲它是不正確的。 –

+0

我相信,你也可以使用'protocol'或'multimethods'按輸入類型 –