Clojure:作業には、java.util.HashMapに慣用的Clojureファッション
-
13-09-2019 - |
質問
してい java.util.HashMap
オブジェクト m
(戻り値からの呼び出しのJavaコード)といいなと思っていく新しいマップ追加のキー-値ペアです。
の場合 m
たClojure地図を使ってみました:
(assoc m "key" "value")
もしようが議論されているようである HashMap
受けとる:
java.lang.ClassCastException:java.util.HashMapができなキャストclojure.lang.連想
不運 seq
のいずれかの
(assoc (seq m) "key" "value")
java.lang.ClassCastException:clojure.lang.IteratorSeqできなキャストclojure.lang.連想
のみから受けることになってしまいました HashMap
"作成"を put
, ものを返します void
って明示的に戻す m
:
(do (. m put "key" "value") m)
これは慣用的Clojureコードでは、プラス思修正 m
代わりに新しい。
など、 HashMap
よりClojureっぽしょうか。
解決
Clojureのは、Javaのコレクションは、配列-できます。
あなたが最初にそれにのjava.util.HashMapをのを変換する必要がありますので、しかし、の連想のはのclojure.lang.Associative の想定しています。
(assoc (zipmap (.keySet m) (.values m)) "key" "value")
編集:簡単な解決策ます:
(assoc (into {} m) "key" "value")
他のヒント
ればインターフェースJavaコードでなければならなくなるかもしれのなので、Javaりで、京うちわと共に全国にその .put
.ことを明らかにすることは必ずしも必殺技sin;Clojureでい do
や .
具体的にはできるのはJavaコードです。
assoc
のみで動作Clojureデータ構造では、多くの研究もしていなかったので格安に新規作成は不変で)のコピーとして若干の変化が見られます。Java HashMapsを目的とするものでないこと同じです。いくクローニング毎時間ご変更可能。
なので、しばらく日本にいたJavaの変異-地(例えばかんこれらHashMaps長い時間のないJava電話の場所では必要なものserializeしたい print
や read
, やりたい仕事をしていてもよく、スレッドで安全な利用のClojure STM)までの間の変換にはJava HashMapsとClojureハッシュマップに簡単にでClojureデータ構造を実施権のJavaインタフェースで彼らと話すことができます。
user> (java.util.HashMap. {:foo :bar})
#<HashMap {:foo=:bar}>
user> (into {} (java.util.HashMap. {:foo :bar}))
{:foo :bar}
したい場合は、 do
になってそのオブジェクトを返しますばんばんわの働きを使うことができま doto
.実際、Java HashMapとして用いる例は、公的な身分証明書のためにこの機能は、別表示にしたことのある世界の終わりご利用の場合Javaオブジェクト(judiciously).
clojure.core/doto
([x & forms])
Macro
Evaluates x then calls all of the methods and functions with the
value of x supplied at the front of the given arguments. The forms
are evaluated in order. Returns x.
(doto (new java.util.HashMap) (.put "a" 1) (.put "b" 2))
しての戦略:
限界突然変異および副作用の単一の機能が使用できます。ご関数で返します.同じ値の入力で使ってやりたいことはできます。時にはひとつのメカニズムに配列または地図の最も効率の高いあるいは簡単に実現しようとするアルゴリズムです。だから利益を享受のプログラミングとん"漏えいなどの副作用の世界が見えてきます。
合物を約が必要な遊びにもその他のClojureコードしてみてClojureデータ構造をとることもでき、それを鋳型で固めて入Java HashMaps最後の時ィードバックする
全然OKのjavaのハッシュマップの伝統です。
(do (. m put "key" "value") m)
This is not idiomatic Clojure code, plus I'm modifying m instead of creating a new map.
だ改変したデータ構造かを調べるために使うことができます Javaのハッシュマップが構造的に共有 こClojures地図するので効率的にコピーされます。一般の慣用いということがで使用java-interopの機能をjava構造の典型的なjavaのようにきれいに変換してClojure構造としての機能Clojureです。ない限りのコースでの生活をより容易によりコードすべてのベットはオフになります。
これは、私が
Javaの対Clojureのバージョンのメモリ特性を比較しようとしている(ただし、Clojureのから使用)されたとき、私はハッシュマップを使って書いたいくつかのコードです(import '(java.util Hashtable)) (defn frequencies2 [coll] (let [mydict (new Hashtable)] (reduce (fn [counts x] (let [y (.toLowerCase x)] (if (.get mydict y) (.put mydict y (+ (.get mydict y) 1)) (.put mydict y 1)))) coll) mydict))
これは、いくつかのコレクションを取り、それぞれ異なるものが(たとえば、文字列中の単語)が再利用された回数を返すことです。