Clojure:以惯用的Clojure方式使用java.util.HashMap [英] Clojure: working with a java.util.HashMap in an idiomatic Clojure fashion

查看:322
本文介绍了Clojure:以惯用的Clojure方式使用java.util.HashMap的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 java.util.HashMap 对象 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 : 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)



编辑:更简单的解决方案:

$ p $ (assoc(into {} m)key value)


I have a 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.

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 own put, but that returns void so I have to explicitly return m:

(do (. m put "key" "value") m)

This is not idiomatic Clojure code, plus I'm modifying m instead of creating a new map.

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:以惯用的Clojure方式使用java.util.HashMap的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆