2012-02-14 6 views
5

java.util.LinkedHashSetを返すメソッドを使用してJava APIへのClojureインターフェイスを作成しています。JavaコレクションをClojureデータ構造に変換する

まず、LinkedHashSetをクロージャーデータ構造に変換するためにこれを扱う慣用的なClojureの方法はありますか?

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

答えて

12

は、多くのオプションがあります。これは、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 APIを迅速かつ効率的に使用したい場合は、Javaコレクションで直接Java相互運用機能を使用してください。
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> 
2

私は普遍的に受け入れ練習があるかどう正直わかりませんが、あなたは元の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"} 
関連する問題