将Clojure数据结构转换为Java集合

将数据结构转换为Java集合的Clojure惯用方法是什么,具体如下:

  • []到一个java.util.ArrayList
  • {} java.util.HashMapjava.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接口和ArrayListHashSetLinkedList可以接受一个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}