2010-11-30 15 views
37

एक जावा संग्रह करने के लिए एक डेटा संरचना परिवर्तित करने के लिए Clojure-मुहावरेदार भी तरह से, विशेष रूप से क्या है:परिवर्तित जावा संग्रह में Clojure डेटा संरचनाओं

  • एक java.util.ArrayList
  • {} करने के लिए एक java.util.HashMap
  • #{} को []java.util.HashSet
  • ()java.util.LinkedList

क्या ऐसा करने के लिए कोई clojure.contrib लाइब्रेरी है?

उपयोग केस: मेरे संगठन में क्लोजर को कम करने के लिए, मैं क्लोजर में एक ऑल-जावा रीस्ट सर्वर के लिए यूनिट-टेस्ट सूट लिखने पर विचार कर रहा हूं। मैंने स्कैला में सूट का हिस्सा लिखा है, लेकिन लगता है कि क्लोजर बेहतर हो सकता है क्योंकि मैक्रो समर्थन बॉयलरप्लेट कोड को बहुत कम कर देगा (मुझे दर्जनों समान आरईएसटी सेवा कॉलों की जांच करने की आवश्यकता है)।

मैं डेटाबेस कनेक्शन का नकल करने के लिए EasyMock का उपयोग कर रहा हूं (क्या कोई बेहतर तरीका है?) और मेरे मॉक किए गए तरीकों को कॉलर्स को java.util.List<java.util.Map<String, Object>> आइटम (डेटाबेस पंक्ति सेट का प्रतिनिधित्व करने) की आवश्यकता है। मैं [{ "first_name" "Joe" "last_name" "Smith" "date_of_birth" (date "1960-06-13") ... } ...] संरचना में अपने नकली में पास कर दूंगा और इसे आवश्यक जावा संग्रह में परिवर्तित कर दूंगा ताकि इसे अपेक्षित प्रारूप में कॉलर पर वापस किया जा सके।

+6

तरीकों वापस जाने के लिए की जरूरत है 'java.util.List', फिर वहाँ एक clojure के बाद से परिवर्तित करने की आवश्यकता नहीं वेक्टर * एक * सूची 'है। आपको केवल तभी परिवर्तित करना होगा यदि आवश्यक प्रकार एक विशिष्ट कार्यान्वयन वर्ग है, उदा। 'ArrayList'। –

उत्तर

65

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

मुझे यह नहीं पता था। यह बिल्कुल सही है. धन्यवाद। – Ralph

+2

बस क्लोजर मानचित्र में कीवर्ड कुंजी को स्ट्रिंग में बदलने की आवश्यकता होने पर आप "स्ट्रिंगिफ़-चाबियाँ" का उपयोग कर सकते हैं जो clojure.walk में भी मिल सकते हैं। –

संबंधित मुद्दे