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

发布于 2024-10-04 18:27:43 字数 795 浏览 4 评论 0 原文

将数据结构转换为 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> 项(代表数据库行集)给调用者。我会将 [{ "first_name" "Joe" "last_name" "Smith" "date_of_birth" (date "1960-06-13") ... } ...] 结构传递给我的mock 并将其转换为所需的 Java 集合,以便可以以预期的格式返回给调用者。

What is the Clojure-idiomatic way to convert a data structure to a Java collection, specifically:

  • [] to a java.util.ArrayList
  • {} to a java.util.HashMap
  • #{} to a java.util.HashSet
  • () to a java.util.LinkedList

Is there a clojure.contrib library to do this?

USE CASE: In order to ease Clojure into my organization, I am considering writing a unit-test suite for an all-Java REST server in Clojure. I have written part of the suite in Scala, but think that Clojure may be better because the macro support will reduce a lot of the boilerplate code (I need to test dozens of similar REST service calls).

I am using EasyMock to mock the database connections (is there a better way?) and my mocked methods need to return java.util.List<java.util.Map<String, Object>> items (representing database row sets) to callers. I would pass in a [{ "first_name" "Joe" "last_name" "Smith" "date_of_birth" (date "1960-06-13") ... } ...] structure to my mock and convert it to the required Java collection so that it can be returned to the caller in the expected format.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

生来就爱笑 2024-10-11 18:27:43

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 映射类实现 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 vector, set and list classes implement the java.util.Collection interface and ArrayList, HashSet and LinkedList can take a java.util.Collection constructor argument. So you can simply do:

user=> (java.util.ArrayList. [1 2 3])
#<ArrayList [1, 2, 3]>
user=> (.get (java.util.ArrayList. [1 2 3]) 0)
1

Similarly, Clojure map class implements java.util.Map interface and HashMap takes a java.util.Map constructor argument. So:

user=> (java.util.HashMap. {"a" 1 "b" 2})
#<HashMap {b=2, a=1}>
user=> (.get (java.util.HashMap. {"a" 1 "b" 2}) "a")
1

You can also do the reverse and it is much easier:

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}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文