【问题标题】:How to distinguish java map from clojure map?如何区分 java map 和 clojure map?
【发布时间】:2016-04-14 14:54:50
【问题描述】:

假设我有以下代码:

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

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

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

开箱即用?

【问题讨论】:

  • 你试过使用type吗?

标签: dictionary clojure clojure-java-interop


【解决方案1】:

您可以使用map? 来检查某些东西是否实现了IPersistentMap,这对于Clojure 映射是正确的,但对于java.utils.* 映射不是:

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

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

【讨论】:

  • 是的,实际上是在考虑使用map?,但是(def java-map? (complement map?)) - 这会在其他类型的对象上给出不正确的结果:(java-map? []) ;; => true
  • 是的,你是对的,让我删除答案的那部分,因为它不正确。
  • 我相信,您也可以使用protocolmultimethods 按输入类型进行调度
【解决方案2】:

我会这样做:

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 的持久映射。

【讨论】:

  • 这对我来说似乎是合法的。
猜你喜欢
  • 2014-11-20
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多