将Clojure数据结构转换为Java集合
将数据结构转换为Java集合的Clojure惯用方法是什么,具体如下:
-
[]
到一个java.util.ArrayList
-
{}
java.util.HashMap
到java.util.HashMap
-
#{}
到一个java.util.HashSet
-
()
到一个java.util.LinkedList
有一个clojure.contrib库来做到这一点?
用例 :为了将Clojure放到我的组织中,我正在考虑为Clojure中的所有Java REST服务器编写一个unit testing套件。 我已经在Scala中编写了部分套件,但是认为Clojure可能会更好,因为macros支持会减less很多样板代码(我需要testing几十个类似的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向量,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}