Преобразование структур данных Clojure в коллекции Java
Что такое Clojure-идиоматический способ преобразования структуры данных в коллекцию Java, а именно:
[]
кjava.util.ArrayList
{}
кjava.util.HashMap
#{}
кjava.util.HashSet
()
кjava.util.LinkedList
Есть ли библиотека clojure.contrib для этого?
ПРИМЕР ИСПОЛЬЗОВАНИЯ: Чтобы упростить Clojure в моей организации, я планирую написать пакет модульных тестов для полностью Java-REST-сервера в Clojure. Я написал часть пакета на 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, чтобы ее можно было вернуть вызывающей стороне в ожидаемом формате.
1 ответ
Классы Clojure vector, set и list реализуют 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}