Clojure:以一种idomatic Clojure方式使用java.util.HashMap [英] Clojure: working with a java.util.HashMap in an idomatic Clojure fashion
问题描述
我有一个 java.util.HashMap
object m
(从Java代码调用的返回值)并且我想获得一个新的地图与一个额外的键值对。
如果 m
Clojure地图,我可以使用:
(assoc mkeyvalue)
但是,在 HashMap
上尝试:
java.lang.ClassCastException:java.util.HashMap不能转换为clojure.lang.Associative
没有运气与 seq
:
(assoc(seq m)keyvalue)
java.lang.ClassCastException:clojure.lang.IteratorSeq不能转换为clojure.lang.Associative
我设法使用的唯一方法是使用 HashMap
自己的 put
,但返回 void
所以我必须显式返回 m
:
(do(.m putkeyvalue)m)
不是惯用的Clojure代码,加上我正在修改 m
,而不是创建一个新的地图。
如何使用HashMap 在更多的Clojure-ish方式?
Clojure使java集合seq-able,所以你可以直接使用Clojure序列函数上的 java.util.HashMap 。
但 assoc 期望使用 clojure.lang.Associative ,因此您必须先将 java.util.HashMap 转换为:
(assoc(zipmap(.keySet m)(.values m))keyvalue)
pre>
编辑:更简单的解决方案:
(assoc } m)keyvalue)
I have a
java.util.HashMap
objectm
(a return value from a call to Java code) and I'd like to get a new map with an additional key-value pair.If
m
were a Clojure map, I could use:
(assoc m "key" "value")
But trying that on a
HashMap
gives:
java.lang.ClassCastException: java.util.HashMap cannot be cast to clojure.lang.Associative
No luck with
seq
either:
(assoc (seq m) "key" "value")
java.lang.ClassCastException: clojure.lang.IteratorSeq cannot be cast to clojure.lang.Associative
The only way I managed to do it was to use
HashMap
's ownput
, but that returnsvoid
so I have to explicitly returnm
:
(do (. m put "key" "value") m)
This is not idiomatic Clojure code, plus I'm modifying
m
instead of creating a new map.Any ideas on how to work with a HashMap in a more Clojure-ish way?
解决方案Clojure makes the java Collections seq-able, so you can directly use the Clojure sequence functions on the java.util.HashMap.
But assoc expects a clojure.lang.Associative so you'll have to first convert the java.util.HashMap to that:
(assoc (zipmap (.keySet m) (.values m)) "key" "value")
Edit: simpler solution:
(assoc (into {} m) "key" "value")
这篇关于Clojure:以一种idomatic Clojure方式使用java.util.HashMap的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!