【发布时间】:2009-11-03 03:43:07
【问题描述】:
我有一个 java.util.HashMap 对象 m(调用 Java 代码的返回值),我想获得一个带有附加键值对的新映射。
如果 m 是 Clojure 映射,我可以使用:
(assoc m "key" "value")
但是在HashMap 上尝试会得到:
java.lang.ClassCastException:java.util.HashMap 无法转换为 clojure.lang.Associative
seq 也没有运气:
(assoc (seq m) "key" "value")
java.lang.ClassCastException: clojure.lang.IteratorSeq 无法转换为 clojure.lang.Associative
我设法做到这一点的唯一方法是使用HashMap 自己的put,但这会返回void,所以我必须明确返回m:
(do (. m put "key" "value") m)
这不是惯用的 Clojure 代码,而且我正在修改 m 而不是创建新地图。
如何以更接近 Clojure 的方式使用 HashMap?
【问题讨论】:
-
我认为这不可能。 Java 的 HashMap 不是持久数据结构,所以要么修改它,要么克隆它并修改克隆版本。
标签: clojure interop hashmap purely-functional clojure-java-interop