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

标签 java data-structures collections clojure

将数据结构转换为 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 集合,以便它可以以预期的格式返回给调用者。

最佳答案

Clojure vector 、集合和列表类实现了 java.util.Collection 接口(interface)和 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 接口(interface),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}

关于java - 将 Clojure 数据结构转换为 Java 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4313505/

相关文章:

java - Collections 类中的方法没有对输入集合进行空检查

java - SWT DateTime 不考虑语言环境

java - 设计牛津英语词典

c++ - 我应该使用哪种数据结构

java - 为什么不能在构造函数中同时传递集合和比较器?

java - “释放”Java 列表中的迭代器

java - JSF 无法将给定对象格式化为日期

java - Mono#then 和 Mono#and 之间的区别?

java - 初学者 : Min Value in Array (Java)

java - 如何从平衡二叉搜索树中按升序打印整数?