Konwersja struktur danych Clojure do kolekcji Java
W przeciwieństwie do Javy, Java nie jest w stanie przekształcić struktury danych w zbiór Javy.]}
-
[]
do ajava.util.ArrayList
-
{}
do ajava.util.HashMap
-
#{}
do ajava.util.HashSet
-
()
do ajava.util.LinkedList
Jest clojure.chcesz to zrobić?
Przypadek użycia: aby ułatwić Clojure w mojej organizacji, rozważam napisanie zestawu testów jednostkowych dla all-Java REST server w Clojure. Napisałem część suite w Scali, ale myślę, że Clojure może być lepszy, ponieważ obsługa makr zmniejszy dużo kodu boilerplate (muszę przetestować dziesiątki podobnych wywołań usługi REST).
Używam EasyMock, aby wyśmiewać połączenia z bazą danych (czy jest lepszy sposób?) i moje metody muszą zwracać java.util.List<java.util.Map<String, Object>>
pozycje (reprezentujące zbiory wierszy bazy danych)do wywołujących. Chciałbym przekazać w strukturze [{ "first_name" "Joe" "last_name" "Smith" "date_of_birth" (date "1960-06-13") ... } ...]
do mojej makiety i przekonwertować ją do wymaganej kolekcji Javy, aby mogła zostać zwrócona do wywołującego w oczekiwany format.
1 answers
Klasy Clojure vector, set i list implementują interfejs java.util.Collection
i ArrayList
, HashSet
i LinkedList
może przyjąć argument konstruktora java.util.Collection
. Więc można po prostu zrobić:
user=> (java.util.ArrayList. [1 2 3])
#<ArrayList [1, 2, 3]>
user=> (.get (java.util.ArrayList. [1 2 3]) 0)
1
Podobnie Klasa Clojure map implementuje interfejs java.util.Map
i HashMap
pobiera argument konstruktora java.util.Map
. Więc:
user=> (java.util.HashMap. {"a" 1 "b" 2})
#<HashMap {b=2, a=1}>
user=> (.get (java.util.HashMap. {"a" 1 "b" 2}) "a")
1
Możesz również zrobić odwrotnie i jest to znacznie łatwiejsze:
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}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-30 12:55:56