web-dev-qa-db-ja.com

Clojureデータ構造をJavaコレクションに変換する

データ構造を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コレクションに変換して、期待される形式で呼び出し元に返すことができるようにします。

40
Ralph

Clojureのvector、set、listクラスはJava.util.Collectionインターフェースを実装し、ArrayListHashSetLinkedListJava.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インターフェイスを実装し、HashMapJava.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}
70
Abhinav Sarkar