[英]Converting Clojure data structures to Java collections
什么是将数据结构转换为Java集合的Clojure-idiomatic方法,具体为:
[]
到java.util.ArrayList
{}
到java.util.HashMap
#{}
到java.util.HashSet
()
到java.util.LinkedList
是否有clojure.contrib库来执行此操作?
使用案例 :为了使Clojure易于进入我的组织,我正在考虑为Clojure中的全Java REST服务器编写单元测试套件。 我已经在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向量,集合和列表类实现了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 map类实现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}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.