データ構造をJavaコレクションに変換するClojureの慣用的な方法は何ですか?具体的には:
[]
_から_Java.util.ArrayList
_{}
_から_Java.util.HashMap
_#{}
_から_Java.util.HashSet
_()
_から_Java.util.LinkedList
_これを行うためのclojure.contribライブラリはありますか?
ユースケース:Clojureを組織に簡単に組み込むために、すべてのJava RESTサーバーをClojureで作成するための単体テストスイートを作成することを検討しています。 Scalaのスイートの一部ですが、マクロのサポートによってボイラープレートコードの多くが削減されるため、Clojureの方が優れていると思います(同様のRESTサービス呼び出しを数十回テストする必要があります)。
EasyMockを使用してデータベース接続をモックし(より良い方法はありますか?)、モックされたメソッドは_Java.util.List<Java.util.Map<String, Object>>
_アイテム(データベース行セットを表す)を呼び出し元に返す必要があります。 [{ "first_name" "Joe" "last_name" "Smith" "date_of_birth" (date "1960-06-13") ... } ...]
構造体をモックに渡し、それを必要なJavaコレクションに変換して、期待される形式で呼び出し元に返すことができるようにします。
Clojureのvector、set、listクラスはJava.util.Collection
インターフェースを実装し、ArrayList
、HashSet
、LinkedList
はJava.util.Collection
コンストラクター引数を取ることができます。だからあなたは簡単に行うことができます:
user=> (Java.util.ArrayList. [1 2 3])
#<ArrayList [1, 2, 3]>
user=> (.get (Java.util.ArrayList. [1 2 3]) 0)
1
同様に、ClojureマップクラスはJava.util.Map
インターフェイスを実装し、HashMap
はJava.util.Map
コンストラクター引数を取ります。そう:
user=> (Java.util.HashMap. {"a" 1 "b" 2})
#<HashMap {b=2, a=1}>
user=> (.get (Java.util.HashMap. {"a" 1 "b" 2}) "a")
1
逆も可能で、はるかに簡単です。
ser=> (into [] (Java.util.ArrayList. [1 2 3]))
[1 2 3]
user=> (into #{} (Java.util.HashSet. #{1 2 3}))
#{1 2 3}
user=> (into '() (Java.util.LinkedList. '(1 2 3)))
(3 2 1)
user=> (into {} (Java.util.HashMap. {:a 1 :b 2}))
{:b 2, :a 1}