java.util.LinkedHashSetを返すメソッドを使用してJavaAPIへのClojureインターフェースを作成しています。
まず、LinkedHashSetをclojureデータ構造に変換するためにこれを処理する慣用的なClojureの方法はありますか?
次に、JavaコレクションをClojureデータ構造に変換するための最良の方法は何ですか?
java.util.LinkedHashSetを返すメソッドを使用してJavaAPIへのClojureインターフェースを作成しています。
まず、LinkedHashSetをclojureデータ構造に変換するためにこれを処理する慣用的なClojureの方法はありますか?
次に、JavaコレクションをClojureデータ構造に変換するための最良の方法は何ですか?
ClojureはJavaコレクションと非常にうまく連携するため、多くのオプションがあります。これは、Clojureで使用するデータ構造によって異なります。
次にいくつかの例を示します。
;; 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
これらのそれぞれをいつ使用するかについては、次のアドバイスをお勧めします。
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との互換性を壊すため、JavaからClojureへのアダプターに反対するChrisHouserが主張しています。
要求した翻訳を実行するには、次を使用します。
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"}