【问题标题】:Converting Clojure data structures to Java collections将 Clojure 数据结构转换为 Java 集合
【发布时间】:2011-05-17 20:14:43
【问题描述】:

将数据结构转换为 Java 集合的 Clojure 惯用方式是什么,具体来说:

  • []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") ... } ...] 结构传递给我的mock 并将其转换为所需的Java 集合,以便它可以以预期的格式返回给调用者。

【问题讨论】:

  • 如果方法需要返回java.util.List,则无需转换,因为clojure向量是一个 List。如果所需的类型是特定的实现类,您应该只需要转换,例如ArrayList.

标签: java data-structures collections clojure


【解决方案1】:

Clojure 向量、集合和列表类实现了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}

【讨论】:

  • 我不知道。那很完美。谢谢。
  • 如果需要将 Clojure 映射中的关键字键转换为字符串,您可以使用“stringify-keys”,它也可以在 clojure.walk 中找到。
猜你喜欢
  • 2012-03-05
  • 2017-08-04
  • 1970-01-01
  • 2014-11-02
  • 1970-01-01
  • 2016-01-27
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
相关资源
最近更新 更多