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 a java.util.ArrayList
  • {} do a java.util.HashMap
  • #{} do a java.util.HashSet
  • () do a java.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.

Author: Ralph, 2010-11-30

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}
 66
Author: Abhinav Sarkar,
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