5

java.util.LinkedHashSetを返すメソッドを使用してJavaAPIへのClojureインターフェースを作成しています。

まず、LinkedHashSetをclojureデータ構造に変換するためにこれを処理する慣用的なClojureの方法はありますか?

次に、JavaコレクションをClojureデータ構造に変換するための最良の方法は何ですか?

4

3 に答える 3

12

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ライブラリをラップしてクリーンなClojureAPIを提示しようとしている場合は、同等のClojureデータ構造に変換することをお勧めします。これはClojureユーザーが期待することであり、潜在的に厄介なJava相互運用機能の詳細を隠すことができます。ボーナスとして、これにより物事が不変になり、使用中にJavaコレクションが変更されるリスクがなくなります。
  • Java APIをすばやく効率的に使用したい場合は、Javaコレクションで直接Java相互運用機能を使用してください。
于 2012-02-14T10:53:48.477 に答える
2

Javaコレクションをclojureに変換する慣用的な方法は、(seq)関数を使用することです。これは、シーケンスを操作するほとんどの関数によってすでに呼び出されています。

(def s (java.util.LinkedHashSet.))
#'user/s
user> (seq s)
nil
user> (.add s "foo")
true
user> (seq s)
("foo")
user> 
于 2012-02-14T10:52:52.427 に答える
2

正直なところ、広く受け入れられている慣行があるかどうかはわかりませんが、元の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"}
于 2012-02-14T10:53:38.843 に答える