Clojure:以惯用的Clojure方式使用java.util.HashMap [英] Clojure: working with a java.util.HashMap in an idiomatic Clojure fashion
问题描述
我有一个 java.util.HashMap
对象 m
(从调用到Java代码的返回值)如果 m
是一个新的地图,并且我想要一个附加的键值对的新地图。 Clojure地图,我可以使用:
(assoc mkeyvalue)
但是在 HashMap
上试试这个:
java.lang.ClassCastException:java.util.HashMap不能转换为clojure.lang.Associative
( assoc(seq m)keyvalue)
java。 lang.ClassCastException:clojure.lang.IteratorSeq无法转换为clojure.lang.Associative
我设法做到的唯一方法是使用 HashMap
自己的 put
,但是返回 void
所以我必须显式返回 m
: p>
(do(。 m)把keyvalue)m)
这不是惯用的Clojure代码, m修改 m
而不是创建新的映射。
如何使用 HashMap
在更多Clojure-ish的方式?
Clojure使java集合seq-able,so您可以直接在 java.util.HashMap 上使用Clojure序列函数。
但是 assoc 需要一个 clojure.lang.Associative ,所以您必须先将 java.util.HashMap 转换为:
(assoc(zipmap(.keySet m)(.values m))keyvalue)
I have a If But trying that on a java.lang.ClassCastException: java.util.HashMap cannot be cast to clojure.lang.Associative No luck with
java.lang.ClassCastException: clojure.lang.IteratorSeq cannot be cast to clojure.lang.Associative The only way I managed to do it was to use This is not idiomatic Clojure code, plus I'm modifying How to work with a 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: Edit: simpler solution:
这篇关于Clojure:以惯用的Clojure方式使用java.util.HashMap的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
编辑:更简单的解决方案:
$ p $
java.util.HashMap
object m
(a return value from a call to Java code) and I'd like to get a new map with an additional key-value pair.m
were a Clojure map, I could use:(assoc m "key" "value")
HashMap
gives:
seq
either:(assoc (seq m) "key" "value")
HashMap
's own put
, but that returns void
so I have to explicitly return m
:(do (. m put "key" "value") m)
m
instead of creating a new map.HashMap
in a more Clojure-ish way?(assoc (zipmap (.keySet m) (.values m)) "key" "value")
(assoc (into {} m) "key" "value")