2010-11-30 61 views
37

什麼是數據結構轉換爲Java集合Clojure的,慣用的方式,具體是:轉換Clojure的數據結構,以Java集合

  • []java.util.ArrayList
  • {}java.util.HashMap
  • #{}java.util.HashSet
  • () to a 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集合,以便可以按預期的格式將其返回給調用者。

+6

如果方法需要返回`java.util.List`,那麼就沒有必要因爲Clojure的轉換vector *是一個*`List`。如果所需的類型是特定的實現類,則只需要進行轉換,例如`ArrayList`。 – 2010-11-30 18:23:11

回答

65

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} 
+0

我不知道。那很完美。謝謝。 – Ralph 2010-11-30 12:41:36