簡體   English   中英

將Clojure數據結構轉換為Java集合

[英]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接口和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 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM