java.util.LinkedHashSetを返すメソッドを使用してJava APIへのClojureインターフェイスを作成しています。JavaコレクションをClojureデータ構造に変換する
まず、LinkedHashSetをクロージャーデータ構造に変換するためにこれを扱う慣用的なClojureの方法はありますか?
第2に、JavaコレクションをClojureデータ構造に変換する最良の方法は何ですか?
java.util.LinkedHashSetを返すメソッドを使用してJava APIへのClojureインターフェイスを作成しています。JavaコレクションをClojureデータ構造に変換する
まず、LinkedHashSetをクロージャーデータ構造に変換するためにこれを扱う慣用的なClojureの方法はありますか?
第2に、JavaコレクションをClojureデータ構造に変換する最良の方法は何ですか?
は、多くのオプションがあります。これは、Clojureで使用するデータ構造によって異なります。
はここにいくつかの例です:あなたはJavaライブラリをラップし、清潔を提示しようとしている場合
;; create a HashSet
(def a (java.util.HashSet.))
(dotimes [i 10] (.add a i))
;; Get all the values as a sequence
(seq a)
=> (0 1 2 3 4 5 6 7 8 9)
;; build a new HashSet containing the values from a
(into #{} a)
#{0 1 2 3 4 5 6 7 8 9}
;; Just use the HashSet directly (high performance, no copy required)
(.contains a 1)
=> true
(.contains a 100)
=> false
これらのそれぞれを使用するとき、私は次のようなアドバイスをお勧めしたいについてClojure APIを使用すると、同等のClojureデータ構造に変換することをお勧めします。これはClojureユーザーが期待するものであり、潜在的に乱雑なJava相互運用機能の詳細を隠すことができます。これにより、Javaコレクションの使用中に突然変異を起こすリスクを回避することができます。
javaコレクションをclojureに変換する慣習的な方法は、シーケンスで動作するほとんどの関数によってすでに呼び出されている(seq)関数を使用することです。
(def s (java.util.LinkedHashSet.))
#'user/s
user> (seq s)
nil
user> (.add s "foo")
true
user> (seq s)
("foo")
user>
私は普遍的に受け入れ練習があるかどう正直わかりませんが、あなたは元のJava APIとの互換性を壊すよう、ここでClojureのアダプターへのJavaに対するクリス・ハウスarguingです。
あなたが求めて翻訳を実行するには、単にintoを使用:Clojureのは、Javaコレクションで非常にうまく演じて以来
user=> (import java.util.LinkedHashSet)
java.util.LinkedHashSet
user=> (def x (LinkedHashSet.))
#'user/x
user=> (.add x "test")
true
user=> (def y (into #{} x))
#'user/y
user=> y
#{"test"}